diff --git a/.github/workflows/cli_draft.yml b/.github/workflows/cli_draft.yml
index f2e5df8191..72da96b454 100644
--- a/.github/workflows/cli_draft.yml
+++ b/.github/workflows/cli_draft.yml
@@ -34,30 +34,30 @@ jobs:
 
       - name: Собрать и установить OInt
         run: |
-          cd ./ru/OInt
+          cd ./src/ru/OInt
           opm build
           opm install *.ospx  
 
       - name: Собрать бинарник
         run: |
-          cd ./ru/cli
+          cd ./src/ru/cli
           oscript -make core/Classes/Приложение.os oint
 
       - name: Собрать exe
         run: |
-          cd ./ru/cli
+          cd ./src/ru/cli
           oscript -make core/Classes/Приложение.os oint.exe
 
       - name: Записать артефакт
         uses: actions/upload-artifact@v4
         with:
           name: oint
-          path: ./ru/cli/oint
+          path: ./src/ru/cli/oint
 
       - name: Создать каталог deb-пакета
         run: |
           mkdir -p .debpkg/usr/bin
-          cp ./ru/cli/oint .debpkg/usr/bin/oint
+          cp ./src/ru/cli/oint .debpkg/usr/bin/oint
           chmod +x .debpkg/usr/bin/oint
 
       - name: Собрать deb-пакет
@@ -81,7 +81,7 @@ jobs:
         run: |
           mkdir -p .rpmpkg/usr/bin
           mkdir -p .rpmpkg/usr/share/oint/bin
-          cp ./ru/cli/oint .rpmpkg/usr/share/oint/bin/oint
+          cp ./src/ru/cli/oint .rpmpkg/usr/share/oint/bin/oint
           echo 'mono /usr/share/oint/bin/oint "$@"' > .rpmpkg/usr/bin/oint
           chmod +x .rpmpkg/usr/bin/oint
 
diff --git a/.github/workflows/cli_test.yml b/.github/workflows/cli_test.yml
index 1cd0a8ba3d..4b0450bbec 100644
--- a/.github/workflows/cli_test.yml
+++ b/.github/workflows/cli_test.yml
@@ -50,30 +50,30 @@ jobs:
 
       - name: Собрать и установить OInt
         run: |
-          cd ./ru/OInt
+          cd ./src/ru/OInt
           opm build
           opm install *.ospx  
 
       - name: Собрать бинарник
         run: |
-          cd ./ru/cli
+          cd ./src/ru/cli
           oscript -make core/Classes/Приложение.os oint
 
       - name: Собрать exe
         run: |
-          cd ./ru/cli
+          cd ./src/ru/cli
           oscript -make core/Classes/Приложение.os oint.exe
 
       - name: Записать артефакт
         uses: actions/upload-artifact@v4
         with:
           name: oint
-          path: ./ru/cli/oint
+          path: ./src/ru/cli/oint
 
       - name: Создать каталог deb-пакета
         run: |
           mkdir -p .debpkg/usr/bin
-          cp ./ru/cli/oint .debpkg/usr/bin/oint
+          cp ./src/ru/cli/oint .debpkg/usr/bin/oint
           chmod +x .debpkg/usr/bin/oint
 
       - name: Собрать deb-пакет
@@ -97,7 +97,7 @@ jobs:
         run: |
           mkdir -p .rpmpkg/usr/bin
           mkdir -p .rpmpkg/usr/share/oint/bin
-          cp ./ru/cli/oint .rpmpkg/usr/share/oint/bin/oint
+          cp ./src/ru/cli/oint .rpmpkg/usr/share/oint/bin/oint
           echo 'mono /usr/share/oint/bin/oint "$@"' > .rpmpkg/usr/bin/oint
           chmod +x .rpmpkg/usr/bin/oint
 
diff --git a/.github/workflows/oint_coverage.yml b/.github/workflows/oint_coverage.yml
index 13423ebce9..403efc3166 100644
--- a/.github/workflows/oint_coverage.yml
+++ b/.github/workflows/oint_coverage.yml
@@ -29,12 +29,12 @@ jobs:
 
       - name: Установить OInt
         run: |
-            cd ./ru/OInt
+            cd ./src/ru/OInt
             opm build
             opm install *.ospx    
 
       - name: Выполнить скрипт определения покрытия
-        run: oscript ./ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os
+        run: oscript ./src/ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os
 
 
 
diff --git a/.github/workflows/os/cli_parse.os b/.github/workflows/os/cli_parse.os
index 4c7afbb44d..230d36ef5c 100644
--- a/.github/workflows/os/cli_parse.os
+++ b/.github/workflows/os/cli_parse.os
@@ -12,8 +12,8 @@
 Процедура ПриСозданииОбъекта()
     
     МодульСоставаОПИ     = Новый ТекстовыйДокумент();
-    ФайлСоставаОПИ       = "./ru/cli/data/Classes/СоставБиблиотеки.os";
-    КаталогСписковСотава = "./ru/cli/data/Classes/internal/Classes/";
+    ФайлСоставаОПИ       = "./src/ru/cli/data/Classes/СоставБиблиотеки.os";
+    КаталогСписковСотава = "./src/ru/cli/data/Classes/internal/Classes/";
 
     ЗаписатьНачалоФайла();
     ЗаписатьФункциюОпределенияВерсии();
@@ -639,7 +639,7 @@
 
     ОбщийМассивМодулей = Новый Массив;
 
-    ФайлыМодулей = НайтиФайлы("./ru/", "*.os", Истина);
+    ФайлыМодулей = НайтиФайлы("./src/ru/", "*.os", Истина);
 
     Для Каждого Модуль Из ФайлыМодулей Цикл
         
@@ -686,7 +686,7 @@
 Функция ПолучитьВерсиюПакета()
 
     Версия     = "";
-    Packagedef = "./ru/OInt/packagedef";
+    Packagedef = "./src/ru/OInt/packagedef";
     Признак    = ".Версия(""";
 
     ТекстФайла = Новый ТекстовыйДокумент();
diff --git a/.github/workflows/os/cli_testmaker.os b/.github/workflows/os/cli_testmaker.os
index 88ed7a891a..d22857a9a4 100644
--- a/.github/workflows/os/cli_testmaker.os
+++ b/.github/workflows/os/cli_testmaker.os
@@ -1,4 +1,4 @@
-#Использовать "../../../ru/cli/data"
+#Использовать "../../../src/ru/cli/data"
 
 Перем СоответствияПараметровЗначениям;
 Перем СоответствияПараметровПредобработкам;
@@ -124,30 +124,30 @@
 	|
 	|      - name: Собрать и установить OInt
 	|        run: |
-	|          cd ./ru/OInt
+	|          cd ./src/ru/OInt
 	|          opm build
 	|          opm install *.ospx  
 	|
 	|      - name: Собрать бинарник
 	|        run: |
-	|          cd ./ru/cli
+	|          cd ./src/ru/cli
 	|          oscript -make core/Classes/Приложение.os oint
 	|
 	|      - name: Собрать exe
 	|        run: |
-	|          cd ./ru/cli
+	|          cd ./src/ru/cli
 	|          oscript -make core/Classes/Приложение.os oint.exe
 	|
 	|      - name: Записать артефакт
 	|        uses: actions/upload-artifact@v4
 	|        with:
 	|          name: oint
-	|          path: ./ru/cli/oint
+	|          path: ./src/ru/cli/oint
 	|
 	|      - name: Создать каталог deb-пакета
 	|        run: |
 	|          mkdir -p .debpkg/usr/bin
-	|          cp ./ru/cli/oint .debpkg/usr/bin/oint
+	|          cp ./src/ru/cli/oint .debpkg/usr/bin/oint
 	|          chmod +x .debpkg/usr/bin/oint
 	|
 	|      - name: Собрать deb-пакет
@@ -171,7 +171,7 @@
 	|        run: |
 	|          mkdir -p .rpmpkg/usr/bin
 	|          mkdir -p .rpmpkg/usr/share/oint/bin
-	|          cp ./ru/cli/oint .rpmpkg/usr/share/oint/bin/oint
+	|          cp ./src/ru/cli/oint .rpmpkg/usr/share/oint/bin/oint
 	|          echo 'mono /usr/share/oint/bin/oint ""$@""' > .rpmpkg/usr/bin/oint
 	|          chmod +x .rpmpkg/usr/bin/oint
 	|
diff --git a/.github/workflows/os/convert.os b/.github/workflows/os/convert.os
index fe16a1e9c5..9daa3be65b 100644
--- a/.github/workflows/os/convert.os
+++ b/.github/workflows/os/convert.os
@@ -1,7 +1,7 @@
 Функция ПолучитьСопоставлениеФайлов()
 
 	Сопоставление = Новый Соответствие();
-	ФайлыМодулей  = НайтиФайлы("./ru/", "*.bsl", Истина);
+	ФайлыМодулей  = НайтиФайлы("./src/ru/", "*.bsl", Истина);
 	Признак       = "// Расположение OS: ";
 
 	Для Каждого Файл Из ФайлыМодулей Цикл
@@ -22,7 +22,7 @@
 
 				ПутьOS = СтрЗаменить(ТекущаяСтрока, Признак, "");
 				ПутьOS = СокрЛП(ПутьOS);
-				ПутьOS = СтрЗаменить(ПутьOS, "./", "./ru/");
+				ПутьOS = СтрЗаменить(ПутьOS, "./", "./src/ru/");
 				Сопоставление.Вставить(ТекущийФайл, ПутьOS);
 
 			КонецЕсли;
@@ -155,8 +155,8 @@
 
 Процедура ОбновитьНомерВерсии()
 
-	ПутьПД = "./ru/OInt/packagedef";
-	ПутьКФ = "./ru/OPI/src/Configuration/Configuration.mdo";
+	ПутьПД = "./src/ru/OInt/packagedef";
+	ПутьКФ = "./src/ru/OPI/src/Configuration/Configuration.mdo";
 	Версия = "";
 
 	ЧтениеДанныхКонфигурации = Новый ЧтениеXML();
@@ -197,7 +197,7 @@
 
 		ТекущийМодуль = Модуль.Значение;
 		ФайлМодуля    = Новый Файл(ТекущийМодуль);
-		ПутьМодуля    = СтрЗаменить(ТекущийМодуль, "./ru/OInt/", "");
+		ПутьМодуля    = СтрЗаменить(ТекущийМодуль, "./src/ru/OInt/", "");
 		Бибилотека    = ФайлМодуля.ИмяБезРасширения;
 
 		Если Бибилотека = "OPI_Тесты" Тогда
@@ -210,7 +210,7 @@
 	КонецЦикла;
 	
 	Документ.ДобавитьСтроку("</package-def>");
-	Документ.Записать("./ru/OInt/lib.config");
+	Документ.Записать("./src/ru/OInt/lib.config");
 
 КонецПроцедуры
 
diff --git a/.github/workflows/os/docs_examples.os b/.github/workflows/os/docs_examples.os
index 1c7ae310d6..25e7d956f7 100644
--- a/.github/workflows/os/docs_examples.os
+++ b/.github/workflows/os/docs_examples.os
@@ -1,5 +1,5 @@
 #Использовать osparser
-#использовать "../../../ru/OInt/tools/"
+#использовать "../../../src/ru/OInt/tools/"
 
 Перем МодульТестов;
 Перем Парсер;
@@ -10,7 +10,7 @@
 
 Процедура ПриСозданииОбъекта()
 	
-	ПутьКТестам           = "./ru/OInt/tests/Modules/internal/OPI_Тесты.os";
+	ПутьКТестам           = "./src/ru/OInt/tests/Modules/internal/OPI_Тесты.os";
 	ОбластьТестов         = "АтомарныеТесты";
 	КаталогСохранения     = "./docs/examples/";
 	КаталогЗаписиЗначений = "./docs/data/";
diff --git a/.github/workflows/os/oint_dictionary.os b/.github/workflows/os/oint_dictionary.os
index f3cfd378d0..579b36abb1 100644
--- a/.github/workflows/os/oint_dictionary.os
+++ b/.github/workflows/os/oint_dictionary.os
@@ -24,7 +24,7 @@
 
 Процедура СоздатьСловарь(Знач Язык)
 
-	ФайлыМодулей  = НайтиФайлы("./ru/", "*.os", Истина);
+	ФайлыМодулей  = НайтиФайлы("./src/ru/", "*.os", Истина);
 	СписокСлов    = Новый СписокЗначений();
 
 	Для Каждого Модуль Из ФайлыМодулей Цикл
@@ -64,6 +64,8 @@
 
 	КонецЦикла;
 
+	ДобавитьКлючевыеСловаЯзыка(СоответствиеСловаря);
+
 	ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря);
 
 КонецПроцедуры
@@ -307,5 +309,19 @@
 
 КонецФункции
 
+Процедура ДобавитьКлючевыеСловаЯзыка(СоответствиеСловаря)
+
+	ПутьКСловарюКлючевыхСлов = "./service/dictionaries/keywords.json";
+	ЧтениеJSON = Новый ЧтениеJSON();
+	ЧтениеJSON.ОткрытьФайл(ПутьКСловарюКлючевыхСлов);
+	СоответствиеКС = ПрочитатьJSON(ЧтениеJSON, Истина);
+	ЧтениеJSON.Закрыть();
+
+	Для Каждого КлючевоеСлово Из СоответствиеКС Цикл
+		СоответствиеСловаря.Вставить(КлючевоеСлово.Ключ, СокрЛП(КлючевоеСлово.Значение));
+	КонецЦикла;
+
+КонецПроцедуры
+
 СоздатьСловари();
 
diff --git a/.github/workflows/os/oint_testmaker.os b/.github/workflows/os/oint_testmaker.os
index 8e9447ab72..4b7b029367 100644
--- a/.github/workflows/os/oint_testmaker.os
+++ b/.github/workflows/os/oint_testmaker.os
@@ -1,4 +1,4 @@
-#Использовать "../../../ru/OInt/tools/"
+#Использовать "../../../src/ru/OInt/tools/"
 
 Перем СоответствияПараметровЗначениям;
 Перем СоответствияПараметровПредобработкам;
diff --git a/.github/workflows/os/opi_translate.os b/.github/workflows/os/opi_translate.os
index 6138c2da4f..815ba47e6b 100644
--- a/.github/workflows/os/opi_translate.os
+++ b/.github/workflows/os/opi_translate.os
@@ -12,6 +12,11 @@
 	ТаблицаСловаря.Колонки.Добавить("ИмяМодуля");
 
 	Для Каждого Словарь Из ФайлыСловарей Цикл
+
+		Если Словарь.ИмяБезРасширения = "keywords" Тогда
+			Продолжить;
+		КонецЕсли;
+		
 		СоздатьЛокализацию(Словарь);
 	КонецЦикла;
 
@@ -25,16 +30,21 @@
 	ПолучитьТаблицуСловаря(ПутьКСловарю);
 
 	КаталогИсточник = Новый Файл(".\ru\OPI");
-	КаталогПриемник = Новый Файл(".\" + Язык + "\OPI");
+	КаталогПриемник = Новый Файл(".\service\interim\" + Язык + "\OPI");
 
 	Если КаталогПриемник.Существует() Тогда
 		УдалитьФайлы(КаталогПриемник.ПолноеИмя);
 	КонецЕсли;
 
 	СкопироватьФайлы(КаталогИсточник.ПолноеИмя, КаталогПриемник.ПолноеИмя);
-	ФайлыМодулей  = НайтиФайлы("./" + Язык + "/", "*.bsl", Истина);
+	ФайлыМодулей  = НайтиФайлы(".\service\interim\" + Язык + "\", "*", Истина);
 
 	Для Каждого ФайлМодуля Из ФайлыМодулей Цикл
+
+		Если ФайлМодуля.ЭтоКаталог() Тогда
+			Продолжить;
+		КонецЕсли;
+
 		ПеревестиМодуль(ФайлМодуля.ПолноеИмя);
 	КонецЦикла;
 
diff --git a/service/dictionaries/en.json b/service/dictionaries/en.json
index 3d38af1348..1d65317a43 100644
--- a/service/dictionaries/en.json
+++ b/service/dictionaries/en.json
@@ -1,3029 +1,3045 @@
 {
-"К": "To",
-"И": "And",
 "В": "In",
+"к": "to",
+"К": "To",
 "Н": "N",
-"д": "d",
+"И": "And",
 "в": "in",
 "с": "with",
-"к": "to",
-"из": "from",
-"Из": "Of",
-"ФС": "FS",
-"По": "by",
-"на": "to",
-"См": "See",
-"ДД": "BD",
-"Не": "Not",
+"д": "d",
 "ПС": "PS",
-"МБ": "MB",
+"Не": "Not",
+"ДД": "BD",
 "ВК": "VK",
-"Или": "Or",
-"Хэш": "Hash",
-"Тег": "Tag",
-"доп": "add",
-"Хеш": "Hash",
-"осн": "main",
-"ООД": "OOD",
-"Таб": "Tab",
-"БСП": "BSP",
-"Нет": "No",
-"Бан": "Ban",
-"Вид": "View",
-"Что": "What",
-"ИВФ": "AndVF",
-"НПП": "NPP",
-"Час": "Hour",
-"Лев": "Left",
-"Вес": "Weight",
-"Код": "Code",
-"ОТД": "OTD",
-"это": "this",
-"Тип": "Type",
-"Чат": "Chat",
-"ОПИ": "OPI",
-"Окр": "Round",
-"для": "for",
-"Цел": "Goal",
-"тип": "type",
-"без": "without",
+"По": "For",
+"из": "from",
+"ФС": "FS",
+"См": "See",
+"МБ": "MB",
+"Из": "In",
+"на": "to",
 "Для": "For",
-"Имя": "Name",
+"Или": "Or",
+"ООД": "OOD",
+"Вид": "View",
+"для": "for",
+"доп": "add",
+"Нет": "No",
+"Вес": "Weight",
+"БСП": "BSP",
+"Чат": "Chat",
+"НПП": "NPP",
+"Лев": "Left",
+"Тег": "Tag",
+"Хэш": "Hash",
+"это": "this",
+"Хеш": "Hash",
+"Код": "Code",
+"ИВФ": "AndVF",
+"осн": "main",
 "или": "or",
-"Пост": "Post",
-"поля": "fields",
-"Ключ": "Key",
-"Файл": "File",
-"Сайт": "Website",
-"Слак": "Slack",
+"Имя": "Name",
+"без": "without",
+"Что": "What",
+"ОПИ": "OPI",
+"Бан": "Ban",
+"ОТД": "OTD",
+"Цел": "Goal",
+"Час": "Hour",
+"Тип": "Type",
+"Таб": "Tab",
+"Окр": "Round",
+"тип": "type",
+"Авто": "Auto",
+"Линк": "Link",
 "Пара": "Pair",
-"Фото": "Photo",
+"Цикл": "Do",
+"Знач": "Val",
+"Цель": "Purpose",
+"Ключ": "Key",
+"Тема": "Topic",
+"Тело": "Body",
+"Вход": "Entry",
+"Дата": "Date",
+"Файл": "File",
+"АирТ": "AirT",
+"Пока": "WHile",
+"вРег": "inReg",
+"нРег": "nReg",
+"тему": "topic",
+"Слак": "Slack",
+"Поля": "Fields",
+"Ложь": "False",
+"Путь": "Path",
 "быть": "be",
+"всех": "all",
+"Лист": "Sheet",
 "Цвет": "Color",
-"Лого": "Logo",
-"Цикл": "Loop",
+"Поле": "Field",
+"Куда": "To",
+"Фото": "Photo",
 "Цена": "Price",
 "цены": "price",
-"путь": "path",
-"Прав": "Right",
-"фото": "photo",
 "Тест": "Test",
-"Пути": "Paths",
-"АирТ": "AirT",
-"Флаг": "Flag",
-"Пока": "While",
-"тему": "topic",
-"Куда": "To",
-"Вход": "Entry",
-"вРег": "inReg",
-"Знач": "Val",
-"Поля": "Fields",
+"путь": "path",
+"фото": "photo",
 "Блок": "Block",
-"всех": "all",
-"Поле": "Field",
-"Тема": "Topic",
-"Цель": "Purpose",
-"Ложь": "False",
+"Пост": "Post",
 "файл": "file",
-"База": "Base",
-"Тело": "Body",
-"Путь": "Path",
-"Авто": "Auto",
-"Если": "If",
-"Лист": "Sheet",
+"Сайт": "Website",
 "Сред": "Average",
-"Дата": "Date",
-"Линк": "Link",
-"нРег": "nReg",
-"Отбор": "Filter",
+"Прав": "Right",
+"Лого": "Logo",
+"Если": "If",
+"Пути": "Paths",
+"Флаг": "Flag",
+"База": "Base",
+"поля": "fields",
+"Финал": "Final",
+"Набор": "Set",
+"Аудио": "Audio",
+"Товар": "Product",
 "Вызов": "Call",
 "Серый": "Gray",
+"Гифка": "GIF",
 "Белый": "White",
 "Добро": "Welcome",
-"Тесты": "Tests",
-"файлу": "file",
-"Пауза": "Pause",
-"Текст": "Text",
-"Равно": "Equal",
-"Лимит": "Limit",
-"Дата0": "Date0",
-"Листы": "Sheets",
-"файла": "file",
-"Лист2": "Sheet2",
-"Лист1": "Sheet1",
-"Книга": "Book",
-"МБайт": "MByte",
+"Шапка": "Header",
 "Адрес": "Address",
-"Синий": "Blue",
-"Дата1": "Date1",
-"КБайт": "KBytes",
-"Схема": "Scheme",
-"Режим": "Mode",
-"Твиты": "Tweets",
-"нечто": "something",
-"вроде": "like",
-"Форум": "Forum",
-"Части": "Parts",
-"Опрос": "Poll",
-"Токен": "Token",
-"Медиа": "Media",
-"Товар": "Product",
-"Гифка": "GIF",
-"Аудио": "Audio",
-"Файла": "File",
-"Число": "Number",
-"путей": "paths",
-"Финал": "Final",
 "ТЗнач": "TValue",
-"своей": "of its",
-"Файлы": "Files",
-"Блоки": "Blocks",
-"Канал": "Channel",
-"Почта": "Email",
-"Часть": "Part",
-"Сдвиг": "Shift",
-"Заказ": "Order",
+"Файла": "File",
+"Текст": "Text",
 "Видео": "Video",
-"места": "of the venue",
-"Метка": "Label",
 "Опции": "Options",
+"Медиа": "Media",
+"Заказ": "Order",
+"Сдвиг": "Shift",
+"путей": "paths",
+"нечто": "something",
+"Листы": "Sheets",
+"Книга": "Book",
+"вроде": "like",
+"Часть": "Part",
+"Сутки": "Day",
+"Токен": "Token",
+"Твиты": "Tweets",
 "текст": "text",
-"Набор": "Set",
-"Драйв": "Drive",
-"Целое": "Whole",
-"Вывод": "Output",
-"ЕдИзм": "Unit",
+"будет": "will",
+"Номер": "Number",
+"Лист2": "Sheet2",
+"Копия": "Copy",
+"Форум": "Forum",
+"Почты": "Mails",
+"Число": "Number",
+"Тесты": "Tests",
+"Папка": "Folder",
+"Опрос": "Poll",
 "ЯДиск": "YDisk",
+"Драйв": "Drive",
+"своей": "of its",
+"Синий": "Blue",
+"КБайт": "KBytes",
+"Лимит": "Limit",
+"МБайт": "MByte",
+"Равно": "Equal",
+"Отбор": "Filter",
+"Режим": "Mode",
+"ЮТест": "UTest",
+"Метка": "Label",
+"Лист1": "Sheet1",
+"Пауза": "Pause",
+"Ноушн": "Notion",
+"ЕдИзм": "Unit",
+"Ответ": "Response",
+"Тогда": "Then",
+"Файлы": "Files",
+"Схема": "Scheme",
+"Почта": "Email",
+"файлу": "file",
+"места": "of the venue",
+"Дата0": "Date0",
+"Иначе": "Else",
+"Буфер": "Buffer",
 "Всего": "Total",
+"файла": "file",
+"Вывод": "Output",
+"после": "after",
+"Целое": "Whole",
+"Части": "Parts",
 "Новый": "New",
 "Метод": "Method",
-"Шапка": "Header",
-"ЮТест": "UTest",
-"Тогда": "Then",
-"Иначе": "Otherwise",
-"Ноушн": "Notion",
-"будет": "will",
-"Сутки": "Day",
-"Буфер": "Buffer",
-"Папка": "Folder",
-"Копия": "Copy",
-"Номер": "Number",
-"после": "after",
-"Почты": "Mails",
-"Ответ": "Response",
-"Перем": "Variable",
-"группе": "group",
-"Раздел": "Section",
-"Ширина": "Width",
-"Товары": "Products",
-"Кнопка": "Button",
-"СокрЛП": "ShortLP",
-"Скрыть": "Hide",
-"IDТемы": "ThreadID",
-"Кнопки": "Buttons",
-"Работа": "Work",
-"Модуль": "Module",
-"Данные": "Data",
-"товара": "product",
-"Ссылка": "Link",
-"булево": "boolean",
-"ВСпейс": "VSpace",
-"важное": "important",
-"ФотоID": "PhotoID",
-"Важное": "Important",
-"IDФото": "PhotoID",
-"Ответы": "Answers",
-"Альбом": "Album",
-"Рефреш": "Refresh",
-"Вайбер": "Viber",
-"КудаID": "ToID",
-"Иконки": "Icons",
-"Объект": "Object",
-"Парсер": "Parser",
-"Коммит": "Commit",
-"Запись": "Record",
-"данных": "data",
-"Сессия": "Session",
-"начала": "of start",
-"Записи": "Records",
-"Откуда": "From",
-"Дважды": "Twice",
-"Курсор": "Cursor",
-"Булево": "Boolean",
-"Версия": "Version",
-"Запрос": "Request",
-"вывода": "output",
-"Формат": "Format",
-"работы": "work",
-"Ошибка": "Error",
-"Разбан": "Unban",
-"Строки": "Strings",
-"данные": "Data",
-"Вопрос": "Question",
-"Отступ": "Indent",
-"Широта": "Latitude",
-"Прочее": "Miscellaneous",
-"IDЧата": "ChatID",
-"Пароль": "Password",
+"Блоки": "Blocks",
+"Перем": "Var",
+"Дата1": "Date1",
+"Канал": "Channel",
 "Диалог": "Dialog",
-"команд": "commands",
-"Список": "List",
-"Иконка": "Icon",
+"Формат": "Format",
 "Ячейка": "Cell",
-"корень": "root",
-"СКонца": "FromEnd",
-"Высота": "Height",
-"Должно": "Should",
-"Желтый": "Yellow",
-"Статус": "Status",
-"ИДФото": "PhotoID",
-"Сервер": "Server",
-"Это A1": "ThisIsA1",
-"Книга2": "Book2",
-"Первый": "First",
-"Бирюза": "Turquoise",
-"Привет": "Hello",
-"Строка": "String",
-"Размер": "Size",
-"Массив": "Array",
-"метода": "method",
-"ТипЗнч": "TypeValue",
-"Заказы": "Orders",
-"Черный": "Black",
-"Это A2": "ThisIsA2",
-"Способ": "Method",
-"Это B2": "ThisIsB2",
-"Это B4": "ThisIsB4",
+"Запись": "Record",
 "Это B1": "ThisIsB1",
-"Истина": "True",
-"Флажок": "Checkbox",
-"Это A4": "ThisIsA4",
-"Прочие": "Others",
-"опции:": "options:",
-"Текст2": "Text2",
-"Это A3": "ThisIsA3",
+"Это B4": "ThisIsB4",
+"Разбан": "Unban",
+"Раздел": "Section",
+"Первый": "First",
+"Список": "List",
+"Рефреш": "Refresh",
+"булево": "boolean",
+"Дважды": "Twice",
+"Иконки": "Icons",
+"команд": "commands",
+"СокрЛП": "ShortLP",
+"Откуда": "From",
+"Модуль": "Module",
+"Это B2": "ThisIsB2",
+"Работа": "Work",
+"начала": "of start",
+"Скрыть": "Hide",
+"Книга2": "Book2",
+"Сессия": "Session",
+"важное": "important",
 "Это B3": "ThisIsB3",
+"Важное": "Important",
+"ФотоID": "PhotoID",
+"данные": "Data",
+"Данные": "Data",
+"Кнопка": "Button",
+"Ответы": "Answers",
+"Черный": "Black",
+"Это A3": "ThisIsA3",
+"Кнопки": "Buttons",
+"Вайбер": "Viber",
+"корень": "root",
+"ВСпейс": "VSpace",
+"Альбом": "Album",
+"Это A4": "ThisIsA4",
+"Ошибка": "Error",
+"IDТемы": "ThreadID",
+"IDФото": "PhotoID",
+"Клиент": "Client",
+"опции:": "options:",
+"Широта": "Latitude",
+"Способ": "Method",
+"Размер": "Size",
+"ТипЗнч": "TypeValue",
+"ИДФото": "PhotoID",
+"Массив": "Array",
+"Прочие": "Others",
+"вывода": "output",
+"Сервер": "Server",
+"Строка": "String",
+"IDЧата": "ChatID",
+"Запрос": "Request",
+"СКонца": "FromEnd",
+"Флажок": "Checkbox",
+"Должно": "Should",
+"Статус": "Status",
+"Пароль": "Password",
+"Высота": "Height",
+"Прочее": "Miscellaneous",
+"Версия": "Version",
+"Привет": "Hello",
+"Ширина": "Width",
+"Истина": "True",
+"группе": "group",
+"Коммит": "Commit",
+"Ссылка": "Link",
+"Это A2": "ThisIsA2",
+"данных": "data",
+"Товары": "Products",
+"Строки": "Strings",
+"Это A1": "ThisIsA1",
+"Записи": "Records",
 "тестов": "tests",
-"Команды": "Commands",
-"ИДБлока": "BlockID",
-"Вариант": "Option",
-"ЭтоБаза": "ThisIsBase",
-"ТипПоля": "FieldType",
-"Телефон": "Phone",
-"Отметки": "Tags",
-"Область": "Region",
-"Долгота": "Longitude",
-"Отметка": "Timestamp",
-"Каждого": "Each",
-"Консоль": "Console",
-"ИДПоста": "PostID",
-"Фамилия": "Last name",
-"Обычный": "Regular",
-"Таймаут": "Timeout",
-"СНачала": "FromStart",
-"Колонки": "Columns",
-"Подпись": "Signature",
-"ЧатТема": "ChatTopic",
-"Экспорт": "Export",
-"Удаляет": "Deletes",
-"Текущее": "Current",
-"Объекты": "Objects",
-"Обложка": "Cover",
-"Активен": "Active",
-"Строка_": "String_",
-"Аккаунт": "Account",
-"каждого": "each",
-"Граница": "Boundary",
-"Отладка": "Debugging",
-"IDПапки": "FolderID",
-"IDФайла": "FileID",
-"Извлечь": "Extract",
-"Счетчик": "Counter",
-"Булево_": "Boolean_",
-"Скрытый": "Hidden",
+"КудаID": "ToID",
+"метода": "method",
+"работы": "work",
+"товара": "product",
+"Бирюза": "Turquoise",
+"Иконка": "Icon",
+"Курсор": "Cursor",
+"Желтый": "Yellow",
+"Объект": "Object",
+"Отступ": "Indent",
+"Текст2": "Text2",
+"Вопрос": "Question",
+"Булево": "Boolean",
+"Заказы": "Orders",
+"Парсер": "Parser",
 "изменен": "changed",
-"Событие": "Event",
-"события": "events",
-"В офисе": "InOffice",
-"парсера": "parser",
-"Запросы": "Requests",
-"команды": "commands",
-"удалено": "deleted",
-"Процент": "Percent",
-"текущей": "current",
-"ИмяПоля": "FieldName",
-"Удалить": "Delete",
-"Элемент": "Element",
-"Красный": "Red",
-"Таблица": "Table",
-"Секунды": "Seconds",
-"Каталог": "Directory",
-"События": "Events",
-"Признак": "Indication",
-"Зеленый": "Green",
-"граммах": "grams",
-"Символы": "Symbols",
-"Вывести": "Output",
-"Функция": "Function",
-"Закрыть": "Close",
-"Префикс": "Prefix",
-"IDМедиа": "MediaID",
-"Единица": "Unit",
-"Синоним": "Synonym",
-"ВидеоДД": "VideoDD",
-"Твиттер": "Twitter",
-"Попытка": "Attempt",
-"Таблицы": "Tables",
-"Коммент": "Comment",
-"запуска": "start",
-"Ревизия": "Revision",
-"ЕстьТег": "HasTag",
-"справку": "help",
-"ГифкаДД": "GifDD",
-"Разделы": "Sections",
-"ДопФото": "AdditionalPhoto",
-"Реклама": "Advertisement",
-"АудиоДД": "AudioDD",
-"IDПоста": "PostID",
-"Альбомы": "Albums",
-"ОпросID": "PollID",
-"свойств": "properties",
-"Сделать": "Make",
-"ЮТТесты": "UTTests",
-"главную": "main",
-"Глубина": "Depth",
-"Артикул": "SKU",
-"ID темы": "Thread ID",
 "Справка": "Help",
-"Возврат": "Return",
-"Причина": "Reason",
-"вызова:": "call:",
-"Открыть": "Open",
-"Ожидаем": "Awaiting",
-"IDСтены": "WallID",
-"IDВидео": "VideoID",
+"Отметка": "Timestamp",
+"Отметки": "Tags",
+"Удалить": "Delete",
+"Активен": "Active",
+"Обложка": "Cover",
+"Обычный": "Regular",
+"удалено": "deleted",
+"Команды": "Commands",
+"ИЛИ,Или": "Or",
+"ЭтоБаза": "ThisIsBase",
+"парсера": "parser",
+"Альбомы": "Albums",
+"ДопФото": "AdditionalPhoto",
+"Каталог": "Directory",
+"Вариант": "Option",
 "Скрытая": "Hidden",
-"главным": "main",
-"методы:": "methods:",
+"свойств": "properties",
+"Аккаунт": "Account",
+"Артикул": "SKU",
+"Отладка": "Debugging",
+"граммах": "grams",
+"Строка_": "String_",
+"Глубина": "Depth",
+"Сделать": "Make",
+"запуска": "start",
+"ТипПоля": "FieldType",
+"Таблица": "Table",
+"Запросы": "Requests",
+"IDПоста": "PostID",
+"Телефон": "Phone",
+"В офисе": "InOffice",
+"ОпросID": "PollID",
 "История": "Story",
+"Перейти": "Goto",
+"Область": "Region",
+"Реклама": "Advertisement",
+"IDСтены": "WallID",
+"Красный": "Red",
+"Удаляет": "Deletes",
+"Коммент": "Comment",
+"команды": "commands",
+"Граница": "Boundary",
+"текущей": "current",
+"ИДПоста": "PostID",
+"ИДБлока": "BlockID",
+"Символы": "Symbols",
+"главным": "main",
+"Ревизия": "Revision",
+"Функция": "Function",
+"Объекты": "Objects",
+"справку": "help",
+"главную": "main",
+"Префикс": "Prefix",
+"события": "events",
+"Каждого": "Each",
+"IDВидео": "VideoID",
+"Открыть": "Open",
+"Долгота": "Longitude",
+"вызова:": "call:",
+"Событие": "Event",
+"ЕстьТег": "HasTag",
+"Попытка": "Try",
+"Текущее": "Current",
+"Экспорт": "Export",
+"Фамилия": "Last name",
+"Консоль": "Console",
+"Зеленый": "Green",
+"События": "Events",
+"Разделы": "Sections",
+"Синоним": "Synonym",
+"ID темы": "Thread ID",
+"Секунды": "Seconds",
+"Вывести": "Output",
+"Твиттер": "Twitter",
+"Скрытый": "Hidden",
+"Таймаут": "Timeout",
+"Причина": "Reason",
+"ЧатТема": "ChatTopic",
+"Процент": "Percent",
+"Возврат": "Return",
+"Ожидаем": "Awaiting",
+"каждого": "each",
+"ИмяПоля": "FieldName",
 "Команда": "Command",
-"Страница": "Page",
-"ПутьФайл": "FilePath",
-"Кнопка 3": "Button 3",
-"Приемник": "Receiver",
-"ДатаСтоп": "EndDate",
-"РазмерДД": "SizeDD",
-"Вложения": "Attachments",
-"ПотокZip": "ZipStream",
-"Вложение": "Attachment",
-"Источник": "Source",
-"название": "name",
-"Элементы": "Elements",
+"Колонки": "Columns",
+"Булево_": "Boolean_",
+"Подпись": "Signature",
+"Счетчик": "Counter",
+"ЮТТесты": "UTTests",
+"Закрыть": "Close",
+"Признак": "Indication",
+"Единица": "Unit",
+"IDПапки": "FolderID",
+"ВидеоДД": "VideoDD",
+"Таблицы": "Tables",
+"АудиоДД": "AudioDD",
+"методы:": "methods:",
+"IDМедиа": "MediaID",
+"IDФайла": "FileID",
+"СНачала": "FromStart",
+"Элемент": "Element",
+"Извлечь": "Extract",
+"ГифкаДД": "GifDD",
+"ОткудаID": "FromID",
 "Подборка": "Selection",
-"Подробно": "Detailed",
-"Подборки": "Selections",
-"Основная": "Main",
-"URLФайла": "FileURL",
-"IDРаботы": "JobID",
-"В работе": "InProgress",
-"Действие": "Action",
-"Максимум": "Maximum",
-"ХешСумма": "HashSum",
-"варианты": "variants",
-"Значения": "Values",
-"ИДРаботы": "WorkID",
-"магазина": "store",
-"страницу": "page",
-"ИДТовара": "ProductID",
-"Телеграм": "Telegram",
-"описание": "description",
-"JSONДата": "JSONDate",
-"ОбъектВК": "VKObject",
-"Свойства": "Properties",
-"НовоеИмя": "NewName",
+"ПоляБазы": "BaseFields",
+"ID книги": "BookID",
+"СтрВсего": "StrTotal",
+"ИмяФайла": "FileName",
+"ТипЧисло": "TypeNumber",
+"Страница": "Page",
+"входящих": "incoming",
+"Сообщить": "Notify",
+"Делитель": "Divider",
 "ФайлСлак": "SlackFile",
-"подборку": "selection",
-"Строчный": "StringType",
-"Смещение": "Offset",
-"НЕ JSON:": "NOT JSON:",
-"Числовой": "Numeric",
-"СтрокаТЗ": "DataString",
-"Кнопка 2": "Button 2",
+"методами": "methods",
+"Параметр": "Parameter",
+"Проверки": "Checks",
+"ВКорзину": "ToCart",
+"СтрДлина": "StrLength",
 "ФайлТела": "BodyFile",
-"ИмяМедиа": "MediaName",
+"Получить": "Get",
+"Значение": "Value",
+"СтрокаТЗ": "DataString",
+"ID блока": "Block ID",
+"Смещение": "Offset",
 "Разметка": "Markup",
 "Картинка": "Image",
-"ЭтотФайл": "ThisFile",
-"ФайлЛога": "LogFile",
-"Документ": "Document",
-"Не JSON:": "Not JSON:",
-"КонецДня": "EndOfDay",
-"ИмеетТип": "HasType",
-"ОткудаID": "FromID",
-"Отправка": "Sending",
-"ТипЧисло": "TypeNumber",
-"ИмяФайла": "FileName",
-"Название": "Name",
-"ДропБокс": "Dropbox",
-"ЕстьДата": "HasDate",
-"СтрВсего": "StrTotal",
-"каталога": "directory",
-"загрузки": "upload",
-"Загрузка": "Upload",
-"Двоичные": "Binary",
-"БлокJSON": "JSONBlock",
-"ID книги": "BookID",
-"ВКорзину": "ToCart",
-"Оригинал": "Original",
-"Уадление": "Removal",
-"Родитель": "Parent",
-"ИмяЛиста": "SheetName",
-"ID поста": "Post ID",
-"IDКанала": "ChannelID",
-"ID блока": "Block ID",
-"Свойство": "Property",
-"Проверки": "Checks",
-"подборки": "selections",
-"ЭтоКанал": "IsChannel",
-"ПоляБазы": "BaseFields",
-"МассивИД": "IDArray",
-"Делитель": "Divider",
-"Удаление": "Deletion",
-"Кнопка 1": "Button 1",
-"IDИконки": "IconID",
-"Прервать": "Interrupt",
-"входящих": "incoming",
-"отправки": "of sending",
-"СтрДлина": "StrLength",
-"Значение": "Value",
+"Максимум": "Maximum",
+"варианты": "variants",
+"Подборки": "Selections",
 "Записать": "Write",
-"СтрНайти": "StrFind",
-"Получить": "Get",
-"Описание": "Description",
-"Вставить": "Insert",
-"Внимание": "Attention",
-"ВГраница": "WithinBoundary",
-"методами": "methods",
-"Сообщить": "Notify",
-"Добавить": "Add",
-"Основные": "Main",
+"НЕ JSON:": "NOT JSON:",
+"Основная": "Main",
+"Значения": "Values",
+"Документ": "Document",
+"магазина": "store",
+"Действие": "Action",
+"страницу": "page",
+"ФайлЛога": "LogFile",
+"Свойство": "Property",
+"ИДТовара": "ProductID",
+"отправки": "of sending",
+"Подробно": "Detailed",
+"Не JSON:": "Not JSON:",
 "Свернуть": "Collapse",
+"Оригинал": "Original",
+"ИмеетТип": "HasType",
+"Описание": "Description",
+"JSONДата": "JSONDate",
+"Внимание": "Attention",
+"МассивИД": "IDArray",
+"ID поста": "Post ID",
+"загрузки": "upload",
+"РазмерДД": "SizeDD",
+"ИДРаботы": "WorkID",
+"Родитель": "Parent",
+"каталога": "directory",
+"Добавить": "Add",
+"название": "name",
+"ЭтотФайл": "ThisFile",
+"ИмяМедиа": "MediaName",
+"ЭтоКанал": "IsChannel",
+"ПотокZip": "ZipStream",
+"Основные": "Main",
+"В работе": "InProgress",
+"Вложения": "Attachments",
+"Вставить": "Insert",
+"ЕстьДата": "HasDate",
+"Прервать": "Break",
+"БлокJSON": "JSONBlock",
+"ИмяЛиста": "SheetName",
+"Отправка": "Sending",
+"Вложение": "Attachment",
+"Двоичные": "Binary",
+"Элементы": "Elements",
+"IDКанала": "ChannelID",
+"Числовой": "Numeric",
+"СтрНайти": "StrFind",
+"Строчный": "StringType",
+"ХешСумма": "HashSum",
+"Телеграм": "Telegram",
+"ПутьФайл": "FilePath",
+"подборки": "selections",
+"КонецДня": "EndOfDay",
+"Свойства": "Properties",
+"ДатаСтоп": "EndDate",
+"URLФайла": "FileURL",
+"IDРаботы": "JobID",
+"Приемник": "Receiver",
+"Кнопка 1": "Button 1",
+"Кнопка 2": "Button 2",
+"Источник": "Source",
+"подборку": "selection",
+"IDИконки": "IconID",
+"Кнопка 3": "Button 3",
+"Удаление": "Deletion",
+"Уадление": "Removal",
 "Точность": "Precision",
-"Параметр": "Parameter",
-"Значение_": "Value_",
-"Процедура": "Procedure",
-"Заголовок": "Title",
-"Вычислить": "Calculate",
-"ВидеоПуть": "VideoPath",
-"Последний": "Last",
-"РазмерЕСД": "SizeESD",
-"АудиоПуть": "AudioPath",
-"Параметр_": "Parameter_",
-"РазмерЛФХ": "SizeLFH",
-"ИмяМетода": "MethodName",
-"Свойства_": "Properties_",
-"ГифкаПуть": "GifPath",
-"ID канала": "Channel ID",
-"Календари": "Calendars",
-"Вариант 2": "Option 2",
-"Выражение": "Expression",
-"ПолноеИмя": "FullName",
-"Истечение": "Expiration",
-"Строковое": "String",
-"Выполнить": "Execute",
-"Значение:": "Value:",
-"РазмерСДХ": "SizeCDH",
-"Удаленный": "Remote",
-"ПутьКСтат": "PathToStat",
-"окончания": "of end",
+"Название": "Name",
+"описание": "description",
+"ВГраница": "WithinBoundary",
+"НовоеИмя": "NewName",
+"ОбъектВК": "VKObject",
+"ДропБокс": "Dropbox",
+"Загрузка": "Upload",
+"ID товара": "Product ID",
 "МассивИД_": "ArrayID_",
-"Картинка1": "Image1",
+"изменения": "change",
+"ДатаСтарт": "StartDate",
+"Приватный": "Private",
 "Константы": "Constants",
+"Анонимный": "Anonymous",
+"отражения": "reflection",
+"Категории": "Categories",
+"Категория": "Category",
 "ВерсияАпи": "APIVersion",
 "Сигнатура": "Signature",
-"Сообщение": "Message",
-"В корзину": "To cart",
-"СтрШаблон": "StrTemplate",
-"URL файла": "File URL",
-"URLОтвета": "ResponseURL",
-"доступных": "available",
-"Исполнить": "Execute",
-"Вариант 1": "Option 1",
-"ОбъектОПИ": "OPIObject",
-"Заполнено": "Filled",
-"ИДАльбома": "AlbumID",
-"Файл_Стат": "File_Stat",
-"Доступные": "Available",
-"ИмяПакета": "PackageName",
-"НачалоДня": "StartOfDay",
-"ПутьЛогов": "LogPath",
-"HTTPОтвет": "HTTPResponse",
-"Приватный": "Private",
-"Категория": "Category",
-"ПутьКопии": "CopyPath",
-"ИначеЕсли": "ElseIf",
-"Кодировка": "Encoding",
-"ДатаСтарт": "StartDate",
-"ТипСтрока": "TypeString",
-"ТокенБота": "BotToken",
-"отражения": "reflection",
-"Заголовки": "Headers",
-"ТипДанных": "DataType",
-"Имя папки": "Folder name",
-"IDАльбома": "AlbumID",
-"изменения": "change",
-"НовыйТест": "NewTest",
-"Календарь": "Calendar",
-"ТекущийИД": "CurrentID",
-"Изменение": "Change",
-"ВКонтакте": "VK",
-"Удаляемый": "Deletable",
-"программы": "program",
-"Параметры": "Parameters",
-"Подборки_": "Selections_",
-"Коллекция": "Collection",
-"Разобрать": "Parse",
-"ИДЖелтого": "YellowID",
-"Закрывает": "Closes",
-"Прочитать": "Read",
-"Структура": "Structure",
-"ЧтениеZip": "ReadingZip",
-"Служебные": "Service",
-"обработки": "processing",
-"КонецЕсли": "EndIf",
-"Картинка2": "Image2",
-"Открывает": "Opens",
-"ИДОбъекта": "ObjectID",
-"Категории": "Categories",
-"ID товара": "Product ID",
-"Анонимный": "Anonymous",
-"Результат": "Result",
-"РазмерCDH": "SizeCDH",
 "Рекламный": "Advertising",
+"Календарь": "Calendar",
+"Календари": "Calendars",
+"ID канала": "Channel ID",
+"окончания": "of end",
+"URL файла": "File URL",
+"НачалоДня": "StartOfDay",
+"Заголовок": "Title",
+"HTTPОтвет": "HTTPResponse",
+"Значение:": "Value:",
+"IDАльбома": "AlbumID",
+"ИДЖелтого": "YellowID",
+"Строковое": "String",
+"Результат": "Result",
+"Открывает": "Opens",
+"Прочитать": "Read",
 "НовыйЛист": "NewSheet",
-"Параметры_": "Parameters_",
-"МассивЧата": "ChatArray",
-"ФайлОтвета": "ResponseFile",
-"Клавиатура": "Keyboard",
-"ЧтениеJSON": "ReadingJSON",
-"ООО Вектор": "LLC Vector",
-"участникам": "to participants",
-"КонецЦикла": "EndOfLoop",
-"Текст тега": "Tag text",
-"ОтветТокен": "TokenResponse",
-"УдалитьТег": "DeleteTag",
-"библиотеки": "libraries",
-"Файл видео": "Video file",
-"Количество": "Quantity",
-"ИДКампании": "CampaignID",
-"Информация": "Information",
-"ИДКабинета": "CabinetID",
-"Пропустить": "Skip",
-"ИДВарианта": "VariantID",
-"БезСтатуса": "NoStatus",
-"ИмеетДлину": "HasLength",
-"ID диалога": "Dialog ID",
-"ИДКрасного": "RedID",
-"ПутьКФайлу": "FilePath",
-"HTTPЗапрос": "HTTPRequest",
-"ВидЗапроса": "RequestType",
-"ТокенКанал": "ChannelToken",
-"Файл гифки": "GIF file",
-"Файл аудио": "Audio file",
-"ОжидаетЧто": "ExpectsThat",
-"проведения": "of the event",
-"параметров": "parameters",
-"СтрТекущее": "StrCurrent",
-"ЦветТекста": "TextColor",
-"ИДКаталога": "CatalogID",
+"Структура": "Structure",
+"Кодировка": "Encoding",
+"Имя папки": "Folder name",
+"ВКонтакте": "VK",
+"Процедура": "Procedure",
+"Заполнено": "Filled",
+"ИначеЕсли": "ElsIf",
+"доступных": "available",
+"НовыйТест": "NewTest",
+"Сообщение": "Message",
+"ВебКлиент": "WebClient",
+"Разобрать": "Parse",
+"Картинка2": "Image2",
+"Выполнить": "Execute",
+"Закрывает": "Closes",
+"Картинка1": "Image1",
+"Параметры": "Parameters",
+"ТипСтрока": "TypeString",
+"ГифкаПуть": "GifPath",
+"РазмерЛФХ": "SizeLFH",
+"ИДОбъекта": "ObjectID",
+"РазмерЕСД": "SizeESD",
+"ТокенБота": "BotToken",
+"Истечение": "Expiration",
+"Служебные": "Service",
+"ЧтениеZip": "ReadingZip",
+"КонецЕсли": "EndIf",
+"Удаляемый": "Deletable",
+"ПутьКопии": "CopyPath",
+"РазмерСДХ": "SizeCDH",
+"РазмерCDH": "SizeCDH",
+"Вариант 1": "Option 1",
+"АудиоПуть": "AudioPath",
+"Файл_Стат": "File_Stat",
+"Заголовки": "Headers",
+"Свойства_": "Properties_",
+"Изменение": "Change",
+"Коллекция": "Collection",
+"Значение_": "Value_",
+"НаСервере": "AtServer",
+"ИДАльбома": "AlbumID",
+"Вычислить": "Calculate",
+"Выражение": "Expression",
+"ПутьЛогов": "LogPath",
+"ТекущийИД": "CurrentID",
+"ПолноеИмя": "FullName",
+"Подборки_": "Selections_",
+"программы": "program",
+"ТипДанных": "DataType",
+"ИмяПакета": "PackageName",
+"В корзину": "To cart",
+"URLОтвета": "ResponseURL",
+"Удаленный": "Remote",
+"Исполнить": "Execute",
+"ИмяМетода": "MethodName",
+"СтрШаблон": "StrTemplate",
+"НаКлиенте": "AtClient",
+"Последний": "Last",
+"ВидеоПуть": "VideoPath",
+"Доступные": "Available",
+"ОбъектОПИ": "OPIObject",
+"Вариант 2": "Option 2",
+"обработки": "processing",
+"ПутьКСтат": "PathToStat",
+"Параметр_": "Parameter_",
 "СтрПроцент": "StrPercentage",
-"ДатаНачала": "StartDate",
-"Добавление": "Adding",
-"Существует": "Exists",
-"HTTPМетоды": "HTTPMethods",
-"ФорматДаты": "DateFormat",
-"МассивФото": "PhotoArray",
-"Продолжить": "Continue",
-"СерверФото": "PhotoServer",
+"ЗаписьJSON": "WritingJSON",
 "КартинкаДД": "ImageDD",
-"ИДПодборки": "SelectionID",
-"отладочной": "debug",
-"Объявление": "Ad",
+"СтрТекущее": "StrCurrent",
 "ДокументДД": "DocumentDD",
+"ID диалога": "Dialog ID",
+"УдалитьТег": "DeleteTag",
+"Разрешения": "Permissions",
+"ЧтениеJSON": "ReadingJSON",
+"ИмяТаблицы": "TableName",
+"ИДКартинки": "ImageID",
+"КонецЦикла": "EndDo",
+"Файл видео": "Video file",
+"Файл гифки": "GIF file",
+"ПутьКФайлу": "FilePath",
+"ЦветТекста": "TextColor",
+"HTTPМетоды": "HTTPMethods",
+"пожаловать": "welcome",
+"возвращает": "returns",
+"библиотек:": "libraries:",
+"Клавиатура": "Keyboard",
+"Расширение": "Extension",
+"Библиотека": "Library",
+"ВидЗапроса": "RequestType",
+"ФайлОтвета": "ResponseFile",
+"Бан\/Разбан": "Ban\/Unban",
+"Продолжить": "Continue",
+"Параметры:": "Parameters:",
+"Пропустить": "Skip",
+"БезСтатуса": "NoStatus",
+"Информация": "Information",
+"Приложение": "Application",
+"HTTPЗапрос": "HTTPRequest",
+"НовяИконка": "NewIcon",
+"МассивЧата": "ChatArray",
+"ОтветТокен": "TokenResponse",
+"Твит с гиф": "Tweet with gif",
+"Параметры_": "Parameters_",
+"Исключение": "Except",
+"Текст тега": "Tag text",
+"ИДКрасного": "RedID",
+"ИДВарианта": "VariantID",
+"Добавление": "Adding",
+"ID события": "Event ID",
+"Статистика": "Statistics",
+"IDКабинета": "AccountID",
+"Токен бота": "Bot token",
+"ИДКампании": "CampaignID",
+"ИДКабинета": "CabinetID",
+"ИмеетДлину": "HasLength",
+"ОжидаетЧто": "ExpectsThat",
+"Объявление": "Ad",
+"библиотеки": "libraries",
+"параметров": "parameters",
+"Имя товара": "Product name",
+"ДанныеПоля": "FieldData",
+"ФайлВывода": "OutputFile",
+"ПолныйПуть": "FullPath",
+"Назначение": "Destination",
+"СтараяЦена": "OldPrice",
+"отключения": "disconnection",
+"МассивФото": "PhotoArray",
+"СерверФото": "PhotoServer",
+"ИДПодборки": "SelectionID",
+"информации": "information",
+"ФорматДаты": "DateFormat",
+"отладочной": "debug",
 "РазбитьURL": "SplitURL",
 "Соединение": "Connection",
-"Исключение": "Exception",
-"ФайлВывода": "OutputFile",
-"НовяИконка": "NewIcon",
-"ID альбома": "Album ID",
-"IDКартинки": "ImageID",
-"IDКабинета": "AccountID",
-"ИДКартинки": "ImageID",
-"отключения": "disconnection",
-"Статистика": "Statistics",
+"Количество": "Quantity",
 "Сохранение": "Save",
-"Приложение": "Application",
-"информации": "information",
+"Существует": "Exists",
+"ТокенКанал": "ChannelToken",
+"ДатаНачала": "StartDate",
+"проведения": "of the event",
+"ИДКаталога": "CatalogID",
 "МассивИмен": "ArrayOfNames",
+"Файл аудио": "Audio file",
 "ЦветКнопок": "ButtonColor",
-"Библиотека": "Library",
-"пожаловать": "welcome",
-"Токен бота": "Bot token",
-"ЗаписьJSON": "WritingJSON",
-"Разрешения": "Permissions",
-"Твит с гиф": "Tweet with gif",
-"ИмяТаблицы": "TableName",
-"возвращает": "returns",
-"ID события": "Event ID",
-"Новый файл": "NewFile",
-"библиотек:": "libraries:",
-"ПолныйПуть": "FullPath",
-"ДанныеПоля": "FieldData",
-"ХешФункция": "HashFunction",
-"СтараяЦена": "OldPrice",
-"на сервере": "on the server",
-"Имя товара": "Product name",
-"Параметры:": "Parameters:",
 "они разные": "they are different",
-"Назначение": "Destination",
-"Расширение": "Extension",
-"Бан\/Разбан": "Ban\/Unban",
-"ЦелевойПуть": "TargetPath",
-"ИзИсточника": "FromSource",
-"XMLЗначение": "XMLValue",
-"ЛишниеБайты": "ExtraBytes",
-"Комментарии": "Comments",
-"УдалитьЛист": "DeleteSheet",
-"СоздатьЛист": "CreateSheet",
+"ID альбома": "Album ID",
+"на сервере": "on the server",
+"ХешФункция": "HashFunction",
+"участникам": "to participants",
+"ООО Вектор": "LLC Vector",
+"Новый файл": "NewFile",
+"IDКартинки": "ImageID",
+"СоздатьБлок": "CreateBlock",
 "ОтборСтрока": "FilterString",
-"МассивПутей": "PathsArray",
-"МассивЯчеек": "Cell array",
+"НайтиСтроки": "FindLines",
 "МетодПоиска": "SearchMethod",
-"Разделитель": "Delimiter",
-"уведомлений": "notifications",
-"ПолеОтметки": "TimestampField",
-"МассивПолей": "FieldArray",
-"JSONСтрокой": "JSONString",
-"МассивСвязи": "LinkArray",
+"СтрокаФайла": "FileString",
+"ТелоЗапроса": "RequestBody",
+"Цель канала": "Channel purpose",
+"XMLЗначение": "XMLValue",
 "ДанныеСхемы": "SchemaData",
 "УдалитьБлок": "DeleteBlock",
-"ВернутьБлок": "ReturnBlock",
-"Тема канала": "Channel topic",
-"Цель канала": "Channel purpose",
-"СоздатьБлок": "CreateBlock",
-"ТекстОтвета": "ReplyText",
-"ID страницы": "Page ID",
-"Уведомления": "Notifications",
-"НайтиСтроки": "FindLines",
-"Медиагруппа": "MediaGroup",
-"ТекущаяДата": "CurrentDate",
-"ID Родителя": "Parent ID",
-"ОткрытьФайл": "OpenFile",
-"СоздатьБазу": "CreateDatabase",
-"УдалитьФайл": "DeleteFile",
-"СтрЗаменить": "StringReplace",
-"ОбщийМодуль": "CommonModule",
-"ИмяСодержит": "NameContains",
-"ТекущийКлюч": "Current key",
-"СоздатьПоле": "CreateField",
-"Скопировать": "Copy",
-"Цена товара": "Product price",
-"ОписаниеИзм": "EditedDescription",
-"НовыйСпособ": "NewMethod",
-"ТекстКнопки": "ButtonText",
-"ZipРазмерDD": "ZipSizeDD",
-"ИмяКонтакта": "ContactName",
-"ОтборПоТипу": "FilterByType",
-"ОбщийДоступ": "PublicAccess",
-"Токен Viber": "Viber Token",
 "ЗаменаТочки": "DotReplacement",
-"КодВозврата": "ReturnCode",
-"СкачатьФайл": "DownloadFile",
-"ТипВложений": "AttachmentsType",
-"Для YaxUnit": "For YAxUnit",
-"ТелоЗапроса": "RequestBody",
-"МассивВидео": "Video array",
-"Для Asserts": "For Asserts",
-"МассивГифок": "Gif array",
-"Авторизация": "Authorization",
-"МассивМедиа": "MediaArray",
-"Текст твита": "Tweet text",
-"Текст поста": "Post text",
-"ДобавитьТег": "AddTag",
-"ОтветМассив": "ResponseArray",
-"УдалитьПост": "DeletePost",
-"Остаток. -1": "Balance. -1",
-"Новый товар": "New product",
-"Комментарий": "Comment",
-"JSON данные": "JSON data",
-"РазмерБлока": "BlockSize",
-"миллиметрах": "millimeters",
-"ОченьВажное": "VeryImportant",
-"Хеширование": "Hashing",
-"ID подборок": "Selection IDs",
-"РефрешТокен": "RefreshToken",
-"ID подборки": "Selection ID",
-"ID свойства": "Property ID",
-"ВходнойФайл": "InputFile",
-"ID варианта": "Variant ID",
-"ID картинки": "Image ID",
-"ТекстОшибки": "ErrorText",
-"Фон истории": "Story background",
-"МассивБлока": "ArrayBlock",
-"КопироватьВ": "CopyTo",
-"СоздатьПост": "CreatePost",
-"Удалить тег": "Delete tag",
-"Стандартные": "Standard",
-"ОбщийРазмер": "TotalSize",
-"IDОригинала": "OriginalID",
-"НомерГруппы": "GroupNumber",
-"ТекущийФайл": "CurrentFile",
-"Новое видео": "NewVideo",
-"расширением": "extension",
-"НовыйЗапрос": "NewRequest",
-"ТипКонтента": "ContentType",
-"РазмерЧасти": "ChunkSize",
-"ЭтоУдаление": "ThisIsDeletion",
-"ВЗаголовках": "InHeaders",
-"IDСообщения": "MessageID",
-"Петр Петров": "Petr Petrov",
-"СтрокаФайла": "FileString",
+"ZipРазмерDD": "ZipSizeDD",
 "ПолныйОтвет": "FullResponse",
+"ТекстОшибки": "ErrorText",
+"JSONСтрокой": "JSONString",
+"Уведомления": "Notifications",
+"СтрЗаменить": "StringReplace",
+"ФайлНаДиске": "FileOnDisk",
+"Хеширование": "Hashing",
+"ТипКонтента": "ContentType",
+"НоваяСтрока": "NewLine",
+"ТекущаяДата": "CurrentDate",
+"Сортировать": "Sort",
+"уведомлений": "notifications",
+"КопироватьВ": "CopyTo",
+"Скопировать": "Copy",
+"УдалитьФайл": "DeleteFile",
+"расширением": "extension",
+"Тема канала": "Channel topic",
+"МассивСвязи": "LinkArray",
+"ПолеОтметки": "TimestampField",
+"РазмерБлока": "BlockSize",
+"НовыйЗапрос": "NewRequest",
+"миллиметрах": "millimeters",
+"СоздатьПост": "CreatePost",
+"НомерГруппы": "GroupNumber",
+"МассивЯчеек": "Cell array",
+"Новое видео": "NewVideo",
+"ИмяСодержит": "NameContains",
+"ID картинки": "Image ID",
+"СоздатьПоле": "CreateField",
+"Фон истории": "Story background",
 "ИДКатегории": "CategoryID",
+"Петр Петров": "Petr Petrov",
+"ЛишниеБайты": "ExtraBytes",
+"Разделитель": "Delimiter",
+"УдалитьПост": "DeletePost",
+"СкачатьФайл": "DownloadFile",
+"Комментарии": "Comments",
+"ИзИсточника": "FromSource",
+"МассивПолей": "FieldArray",
+"ОписаниеИзм": "EditedDescription",
+"УдалитьЛист": "DeleteSheet",
 "ВнешнийПост": "ExternalPost",
 "ЗаписатьЛог": "WriteLog",
-"Сортировать": "Sort",
-"АдресаПочты": "EmailAddresses",
+"ID подборок": "Selection IDs",
+"ID подборки": "Selection ID",
+"ID свойства": "Property ID",
+"ID варианта": "Variant ID",
+"МассивБлока": "ArrayBlock",
+"ОтветМассив": "ResponseArray",
+"НовыйСпособ": "NewMethod",
+"Комментарий": "Comment",
+"ОтборПоТипу": "FilterByType",
+"ОбщийДоступ": "PublicAccess",
+"Новый товар": "New product",
+"Остаток. -1": "Balance. -1",
+"Цена товара": "Product price",
+"КодВозврата": "ReturnCode",
+"Для YaxUnit": "For YAxUnit",
+"Для Asserts": "For Asserts",
+"СоздатьЛист": "CreateSheet",
+"Текст поста": "Post text",
+"СоздатьБазу": "CreateDatabase",
+"ВернутьБлок": "ReturnBlock",
+"МассивМедиа": "MediaArray",
+"ЭтоУдаление": "ThisIsDeletion",
+"ЦелевойПуть": "TargetPath",
+"ВЗаголовках": "InHeaders",
+"ТекущийФайл": "CurrentFile",
+"РефрешТокен": "RefreshToken",
+"Медиагруппа": "MediaGroup",
+"Текст твита": "Tweet text",
+"ОбщийРазмер": "TotalSize",
+"ТекстКнопки": "ButtonText",
+"Авторизация": "Authorization",
+"МассивПутей": "PathsArray",
+"JSON данные": "JSON data",
+"ОченьВажное": "VeryImportant",
+"МассивГифок": "Gif array",
+"МассивВидео": "Video array",
+"IDСообщения": "MessageID",
+"ОбщийМодуль": "CommonModule",
+"ИмяКонтакта": "ContactName",
+"Токен Viber": "Viber Token",
+"ОткрытьФайл": "OpenFile",
+"ДобавитьТег": "AddTag",
+"Удалить тег": "Delete tag",
+"ТекстОтвета": "ReplyText",
+"РазмерЧасти": "ChunkSize",
 "ЦветКонсоли": "ConsoleColor",
-"ФайлНаДиске": "FileOnDisk",
-"НоваяСтрока": "NewLine",
-"КодировкаURL": "URLencoding",
-"Число,Строка": "Number, String",
-"IDОбсуждения": "DiscussionID",
-"ОсновноеФото": "MainPhoto",
-"Имя контакта": "Contact name",
+"ТекущийКлюч": "Current key",
+"Стандартные": "Standard",
+"ID Родителя": "Parent ID",
+"АдресаПочты": "EmailAddresses",
+"ТипВложений": "AttachmentsType",
+"ID страницы": "Page ID",
+"IDОригинала": "OriginalID",
+"ВходнойФайл": "InputFile",
 "МассивЛистов": "SheetArray",
-"УдалитьТовар": "DeleteProduct",
-"ДанныеЯчейки": "CellData",
-"КлючКартинка": "ImageKey",
-"ЦелеваяСтена": "Target wall",
-"ОтборКоманды": "CommandSelection",
-"РазмерДанных": "DataSize",
-"URL картинки": "Image URL",
-"ПубличныйURL": "PublicURL",
-"СтрокаДанных": "DataString",
-"СтрСоединить": "StrJoin",
-"ID, Значение": "ID, Value",
-"МассивНабора": "Array of Sets",
-"ОписаниеJSON": "JSONDescription",
-"ДопЗаголовки": "AdditionalHeaders",
-"КодСостояния": "StatusCode",
-"СоздатьКнигу": "CreateBook",
-"ИзменитьПоле": "ModifyField",
-"СтрРазделить": "StrSplit",
-"Создать базу": "Create base",
-"ДобавитьЛист": "AddSheet",
-"IDОбъявления": "AdID",
-"Строка,Число": "String, Number",
-"ТекущийТовар": "CurrentProduct",
-"МассивФайлов": "ArrayOfFiles",
-"ДневнойЛимит": "DailyLimit",
-"КонечнаяДата": "EndDate",
-"ТекстСправки": "HelpText",
-"Наименование": "Name",
-"ДобавитьПоле": "AddField",
-"КонецПопытки": "EndOfAttempt",
-"ИДОбсуждения": "DiscussionID",
-"МассивДанных": "Data array",
+"Создать блок": "Create block",
 "Удалить лист": "DeleteSheet",
-"СоздатьОпрос": "CreatePoll",
-"СтрокаВызова": "CallString",
-"ЭтоКоллекция": "ThisIsCollection",
-"Сформировать": "Formulate",
-"МассивЧтения": "ArrayReading",
-"ЦветнойВывод": "ColorOutput",
-"ДатаОтправки": "Sending date",
-"КонецФункции": "EndFunction",
-"КонецОбласти": "EndRegion",
-"Пользователь": "User",
-"Base64Строка": "Base64String",
-"ЗаписатьJSON": "WriteJSON",
-"ФайлОтправки": "SendingFile",
-"МассивПостов": "ArrayOfPosts",
-"Тип вложений": "Attachments type",
-"ПолучитьФайл": "GetFile",
-"ВнешняяСтена": "ExternalWall",
-"Длительность": "Duration",
-"ИмяПараметра": "ParameterName",
-"СоздатьКанал": "CreateChannel",
-"СписокКоманд": "CommandList",
-"Архивировать": "Archive",
-"УдалитьФайлы": "DeleteFiles",
-"Telegram_Бан": "Telegram_Ban",
-"Соответствие": "Match",
-"МассивТаблиц": "TableArray",
-"МассивКнопок": "ButtonArray",
-"ID чата темы": "Thread chat ID",
-"МассивЛишних": "ExtraArray",
-"Удалить пост": "Delete post",
-"Дублирования": "duplicates",
-"ОднаПодОдной": "OneByOne",
-"ДокументПуть": "DocumentPath",
-"Создать пост": "Create post",
-"СтрокаМетода": "MethodLine",
-"Файл размера": "File size",
-"КартинкаПуть": "ImagePath",
+"СоздатьКнигу": "CreateBook",
+"МассивДанных": "Data array",
 "Архивирована": "Archived",
 "ОбъектИконка": "Icon object",
-"МассивТекста": "TextArray",
-"ОтветСтрокой": "ResponseString",
-"Создать блок": "Create block",
-"Создать поле": "Create field",
-"МассивБлоков": "BlockArray",
-"ТолькоОснова": "OnlyBase",
-"Удалить блок": "Delete block",
-"ИДОбъявления": "AnnouncementID",
-"Пользователи": "Users",
-"РодительБаза": "ParentBase",
-"КлючДвоичные": "BinaryKey",
-"НовыйПрефикс": "NewPrefix",
-"Удалить файл": "Delete file",
+"КодСостояния": "StatusCode",
 "загружаемого": "uploading",
+"ДанныеЯчейки": "CellData",
+"ОписаниеJSON": "JSONDescription",
+"ДопЗаголовки": "AdditionalHeaders",
+"ДобавитьЛист": "AddSheet",
+"МассивФайлов": "ArrayOfFiles",
 "Использовать": "Use",
-"пустой ответ": "empty response",
-"ЧислоВСтроку": "NumberToString",
-"СкачатьПапку": "DownloadFolder",
-"ЗаписьДанных": "DataRecording",
-"ЗаписьТекста": "TextRecord",
-"ОсновнойЦвет": "PrimaryColor",
-"ЧтениеДанных": "ReadingData",
-"ЧтениеТекста": "ReadingText",
-"Тестирование": "Testing",
-"Добавить тег": "Add tag",
-"ПотокВПамяти": "MemoryStream",
-"СоздатьПапку": "CreateFolder",
-"ОписаниеТипа": "TypeDescription",
-"ПрочитатьZip": "ReadZip",
-"СжатыеДанные": "CompressedData",
-"Рефреш токен": "Refresh token",
-"ПараметрыURL": "URLParameters",
-"Существующее": "Existing",
-"ID календаря": "Calendar ID",
-"Скачать файл": "Download file",
-"Неопределено": "Undefined",
-"БезВозвратно": "Irrecoverable",
-"Безвозвратно": "Irretrievably",
+"ТолькоОснова": "OnlyBase",
+"ТекущийТовар": "CurrentProduct",
+"УдалитьТовар": "DeleteProduct",
+"ОсновноеФото": "MainPhoto",
+"ОтветСтрокой": "ResponseString",
+"Сформировать": "Formulate",
+"Telegram_Бан": "Telegram_Ban",
+"ВнешняяСтена": "ExternalWall",
+"МассивПостов": "ArrayOfPosts",
+"ИДОбъявления": "AnnouncementID",
+"ПубличныйURL": "PublicURL",
+"Архивировать": "Archive",
+"ПолучитьФайл": "GetFile",
+"КартинкаПуть": "ImagePath",
+"ДокументПуть": "DocumentPath",
+"ИДОбсуждения": "DiscussionID",
+"Твит с видео": "Tweet with video",
 "ТестыРаздела": "SectionTests",
+"ПрочитатьZip": "ReadZip",
+"ПотокВПамяти": "MemoryStream",
 "ZipРазмерLFH": "ZipSizeLFH",
-"ОбновитьФайл": "UpdateFile",
-"МассивТестов": "ArrayOfTests",
-"ТипКоллекции": "CollectionType",
-"СтруктураURL": "URLStructure",
-"ПолучитьДату": "GetDate",
+"ZipРазмерCDH": "ZipSizeCDH",
+"СжатыеДанные": "CompressedData",
+"ЗаписьДанных": "DataRecording",
+"ID, Значение": "ID, Value",
+"ЗаписьТекста": "TextRecord",
+"МестноеВремя": "LocalTime",
+"ОписаниеТипа": "TypeDescription",
+"ЧтениеТекста": "ReadingText",
 "ДокументЛога": "LogDocument",
 "КаталогЛогов": "LogDirectory",
-"МестноеВремя": "LocalTime",
-"ZipРазмерCDH": "ZipSizeCDH",
-"Твит с видео": "Tweet with video",
-"ТекущийРаздел": "CurrentSection",
-"ТекущийМассив": "Current array",
-"НомерТелефона": "PhoneNumber",
-"Файл с Base64": "Base64 File",
-"Идентификатор": "Identifier",
-"Блок картинки": "Image block",
-"ФайлЛокальный": "LocalFile",
-"Новая таблица": "NewTable",
-"МассивТоваров": "Array of products",
-"СимволМассива": "ArraySymbol",
-"МассивКаналов": "ChannelArray",
+"МассивТестов": "ArrayOfTests",
+"ТипКоллекции": "CollectionType",
+"МассивБлоков": "BlockArray",
+"IDОбъявления": "AdID",
+"КонечнаяДата": "EndDate",
+"Удалить блок": "Delete block",
+"Пользователи": "Users",
+"РодительБаза": "ParentBase",
+"МассивЛишних": "ExtraArray",
+"МассивТекста": "TextArray",
+"ДатаОтправки": "Sending date",
+"Пользователь": "User",
+"СоздатьКанал": "CreateChannel",
+"Удалить файл": "Delete file",
+"URL картинки": "Image URL",
+"Строка,Число": "String, Number",
+"СтрокаДанных": "DataString",
+"КодировкаURL": "URLencoding",
+"КлючДвоичные": "BinaryKey",
+"Имя контакта": "Contact name",
+"МассивКнопок": "ButtonArray",
+"ОднаПодОдной": "OneByOne",
+"МассивНабора": "Array of Sets",
+"ЦелеваяСтена": "Target wall",
+"IDОбсуждения": "DiscussionID",
+"КлючКартинка": "ImageKey",
+"РазмерДанных": "DataSize",
+"СоздатьОпрос": "CreatePoll",
+"ДневнойЛимит": "DailyLimit",
+"Удалить пост": "Delete post",
+"МассивЧтения": "ArrayReading",
+"Base64Строка": "Base64String",
+"ФайлОтправки": "SendingFile",
+"Тип вложений": "Attachments type",
+"Длительность": "Duration",
+"ID чата темы": "Thread chat ID",
+"Создать пост": "Create post",
+"ОбновитьФайл": "UpdateFile",
+"ТонкийКлиент": "ThinClient",
+"ЭтоКоллекция": "ThisIsCollection",
+"ИзменитьПоле": "ModifyField",
+"СтрСоединить": "StrJoin",
+"Рефреш токен": "Refresh token",
+"Неопределено": "Undefined",
+"ОсновнойЦвет": "PrimaryColor",
+"ЦветнойВывод": "ColorOutput",
+"ИмяПараметра": "ParameterName",
+"ЧтениеДанных": "ReadingData",
+"СтрокаВызова": "CallString",
+"СтруктураURL": "URLStructure",
+"Создать поле": "Create field",
+"Число,Строка": "Number, String",
+"Добавить тег": "Add tag",
+"СкачатьПапку": "DownloadFolder",
+"пустой ответ": "empty response",
+"КонецОбласти": "EndRegion",
+"КонецФункции": "EndFunction",
+"ОтборКоманды": "CommandSelection",
+"Скачать файл": "Download file",
+"ДобавитьПоле": "AddField",
+"КонецПопытки": "EndTry",
+"Создать базу": "Create base",
+"СоздатьПапку": "CreateFolder",
+"МассивТаблиц": "TableArray",
+"Соответствие": "Match",
+"ЧислоВСтроку": "NumberToString",
+"Наименование": "Name",
+"Безвозвратно": "Irretrievably",
+"НовыйПрефикс": "NewPrefix",
+"ЗаписатьJSON": "WriteJSON",
+"ID календаря": "Calendar ID",
+"Файл размера": "File size",
+"ПараметрыURL": "URLParameters",
+"ПолучитьДату": "GetDate",
+"Дублирования": "duplicates",
+"Существующее": "Existing",
+"СписокКоманд": "CommandList",
+"СтрРазделить": "StrSplit",
+"ТекстСправки": "HelpText",
+"СтрокаМетода": "MethodLine",
+"УдалитьФайлы": "DeleteFiles",
+"Тестирование": "Testing",
+"БезВозвратно": "Irrecoverable",
+"ПолучитьКанал": "GetChannel",
 "ПараметрыJSON": "JSONParameters",
-"Создать папку": "Create folder",
-"ПрочитатьGZip": "ReadGZip",
-"ПрочитатьJSON": "ReadJSON",
-"МассивОтветов": "AnswersArray",
-"ФайловыйПоток": "FileStream",
-"ВладелецВидео": "VideoOwner",
-"Вопрос опроса": "Poll question",
-"ЗагрузкаВидео": "VideoUpload",
-"ID обсуждения": "Discussion ID",
-"СвойстваЛиста": "Sheet properties",
-"ПоставитьЛайк": "LikePost",
-"ЭтоСимвольное": "ThisIsSymbolic",
-"ID объявления": "Ad ID",
-"ОбновитьТокен": "RefreshToken",
-"КартинкаПоста": "PostImage",
-"ПорядокБайтов": "ByteOrder",
-"СоздатьЗапрос": "CreateRequest",
-"РаботаСПолями": "FieldWork",
-"ДобавитьМесяц": "AddMonth",
-"ОтправитьФайл": "SendFile",
-"НомерКампании": "CampaignNumber",
-"Файл картинки": "Image file",
-"ВставитьПосле": "InsertAfter",
-"СтруктураДаты": "DateStructure",
-"СтрокаНомеров": "NumbersString",
-"Число, Строка": "Number, String",
-"Строка, Число": "String, Number",
-"ДФ=yyyy-MM-dd": "DF=yyyy-MM-dd",
-"UnixИстечение": "UnixExpiration",
-"Администратор": "Administrator",
-"ОбъектОбложка": "Cover object",
-"Массив файлов": "Files array",
-"ZipРазмерEOCD": "ZipSizeEOCD",
-"ПутьОригинала": "OriginalPath",
-"Скачать папку": "Download folder",
-"ЗакрытьСессию": "CloseSession",
-"СделатьРепост": "MakeRepost",
-"ЭтоОтложенное": "IsDelayed",
-"Переадресация": "Redirection",
-"ПолучитьТокен": "GetToken",
-"ОписаниеТипов": "TypeDescription",
+"Файл с Base64": "Base64 File",
+"Тестовая цель": "TestGoal",
+"Тестовая тема": "TestTopic",
 "СписокТоваров": "ProductList",
-"ВыборЗначения": "ValueSelection",
-"СтруктураПоля": "FieldStructure",
-"РаботаСТегами": "TagWork",
-"ВывестиСтроку": "PrintString",
-"ЗапросыСТелом": "RequestsWithBody",
-"Создать опрос": "Create poll",
-"ПолучитьТекст": "GetText",
-"Тестовый лист": "TestSheet",
-"РазложитьJSON": "ParseJSON",
-"Описание поля": "Field description",
-"ВозможныеПути": "PossiblePaths",
+"УдалитьОбъект": "DeleteObject",
+"не ограничено": "unlimited",
+"Создать папку": "Create folder",
+"ДобавитьТовар": "AddProduct",
+"ФайловыйПоток": "FileStream",
+"Тестовая база": "TestDatabase",
+"СимволМассива": "ArraySymbol",
 "ПокинутьКанал": "LeaveChannel",
-"ЗагрузитьФайл": "UploadFile",
-"СтрокаЗаписей": "RecordString",
-"УдалитьЗаписи": "DeletePosts",
+"Переадресация": "Redirection",
+"ВывестиСтроку": "PrintString",
+"ДатаОкончания": "EndDate",
+"СоздатьАльбом": "CreateAlbum",
+"Дата создания": "CreationDate",
+"ТекущиеДанные": "Current data",
+"Новое событие": "New event",
+"РаботаСБазами": "DatabaseWork",
+"МассивСобытий": "ArrayOfEvents",
+"СвойстваЛиста": "Sheet properties",
+"ИзменитьТовар": "EditProduct",
+"ПоставитьЛайк": "LikePost",
+"ЗапросыСТелом": "RequestsWithBody",
+"UnixИстечение": "UnixExpiration",
+"ЭтоОтложенное": "IsDelayed",
+"ОбновитьТокен": "RefreshToken",
+"Удалить товар": "Delete product",
+"ОписаниеТипов": "TypeDescription",
+"ЗагрузкаВидео": "VideoUpload",
+"ЕдиницаДанных": "DataUnit",
+"ПрочитаноБайт": "BytesRead",
+"ПрочитатьJSON": "ReadJSON",
+"ОбработатьТег": "ProcessTag",
+"ОткрытьСессию": "OpenSession",
+"Идентификатор": "Identifier",
+"ВозможныйПуть": "PossiblePath",
+"ВозможныеПути": "PossiblePaths",
+"ВозможныйФайл": "PossibleFile",
+"Новая таблица": "NewTable",
+"Создать канал": "Create channel",
+"ЭтоСимвольное": "ThisIsSymbolic",
+"ПолучитьТекст": "GetText",
+"СоздатьЗапрос": "CreateRequest",
+"ОбъектОбложка": "Cover object",
+"Экранирование": "Escaping",
+"СтрокаТаблицы": "TableRow",
+"ТекущийМассив": "Current array",
+"ПолучитьТокен": "GetToken",
+"УдалитьАльбом": "DeleteAlbum",
+"ВладелецВидео": "VideoOwner",
+"ЛишниеСимволы": "ExtraCharacters",
+"СтрокаТоваров": "ProductsString",
+"СделатьРепост": "MakeRepost",
+"Описание поля": "Field description",
+"МассивОтветов": "AnswersArray",
+"КодУстройства": "DeviceCode",
+"Адрес объекта": "Object address",
+"НомерКампании": "CampaignNumber",
 "АдресЗагрузки": "UploadURL",
 "ОтветЗагрузки": "UploadResponse",
-"ПолучитьЧисло": "GetNumber",
+"ПутьОригинала": "OriginalPath",
 "ИсходныйПоток": "SourceStream",
-"Версия: 2.4.8": "Version: 2.4.8",
-"Метод,Область": "Method,Region",
-"СоздатьАльбом": "CreateAlbum",
-"ДобавитьТовар": "AddProduct",
-"ОтветПроверки": "CheckResponse",
-"ПрочитаноБайт": "BytesRead",
-"ПолучитьКанал": "GetChannel",
-"ВозможныйФайл": "PossibleFile",
-"ДатаОкончания": "EndDate",
-"Создать книгу": "CreateBook",
-"ИзменитьТовар": "EditProduct",
-"НовыйРодитель": "NewParent",
-"НомерСтраницы": "PageNumber",
-"Адрес объекта": "Object address",
-"ЗакрытьДиалог": "CloseDialog",
-"не ограничено": "unlimited",
-"ОткрытьДиалог": "OpenDialog",
-"Новое событие": "New event",
-"КодУстройства": "DeviceCode",
-"Обновить файл": "Update file",
-"СоздатьЗаписи": "CreatePosts",
-"Экранирование": "Escaping",
-"ДатаИстечения": "ExpirationDate",
-"Дата создания": "CreationDate",
-"МассивЗаказов": "ArrayOfOrders",
-"ВозможныйПуть": "PossiblePath",
-"ТаблицаТестов": "TestTable",
-"УдалитьАльбом": "DeleteAlbum",
-"Удалить товар": "Delete product",
-"ТекущийОбъект": "CurrentObject",
-"ИДКомментария": "CommentID",
-"СтрокаТаблицы": "TableRow",
-"УдалитьОбъект": "DeleteObject",
-"Создать канал": "Create channel",
-"МассивСобытий": "ArrayOfEvents",
-"Тестовая тема": "TestTopic",
-"СтрокаТоваров": "ProductsString",
-"ЛишниеСимволы": "ExtraCharacters",
+"Массив кнопок": "Array of buttons",
+"Блок картинки": "Image block",
+"Строка, Число": "String, Number",
+"ПорядокБайтов": "ByteOrder",
 "Изменить поле": "Modify field",
-"РаботаСБазами": "DatabaseWork",
-"ТекущиеДанные": "Current data",
-"Тестовая база": "TestDatabase",
+"Администратор": "Administrator",
+"Вопрос опроса": "Poll question",
+"ПолучитьЧисло": "GetNumber",
+"ТекущийОбъект": "CurrentObject",
+"РаботаСТегами": "TagWork",
+"СтрокаНомеров": "NumbersString",
+"ТаблицаТестов": "TestTable",
+"ОтправитьФайл": "SendFile",
+"Обновить файл": "Update file",
+"Файл картинки": "Image file",
+"ДобавитьМесяц": "AddMonth",
+"СоздатьЗаписи": "CreatePosts",
+"МассивКаналов": "ChannelArray",
+"НовыйРодитель": "NewParent",
+"ДФ=yyyy-MM-dd": "DF=yyyy-MM-dd",
+"ВставитьПосле": "InsertAfter",
+"УдалитьЗаписи": "DeletePosts",
+"ИДКомментария": "CommentID",
+"СтрокаЗаписей": "RecordString",
+"ВыборЗначения": "ValueSelection",
+"НомерТелефона": "PhoneNumber",
+"СтруктураДаты": "DateStructure",
+"ТекущийРаздел": "CurrentSection",
+"ПодСообщением": "UnderMessage",
+"ОтветПроверки": "CheckResponse",
 "ПолучитьКнигу": "GetBook",
-"ОткрытьСессию": "OpenSession",
+"Создать опрос": "Create poll",
+"ЗакрытьСессию": "CloseSession",
+"РазложитьJSON": "ParseJSON",
+"ПрочитатьGZip": "ReadGZip",
+"Версия: 2.4.8": "Version: 2.4.8",
+"ФайлЛокальный": "LocalFile",
+"Число, Строка": "Number, String",
+"НомерСтраницы": "PageNumber",
+"Добавить лист": "AddSheet",
+"МассивТоваров": "Array of products",
+"ЗакрытьДиалог": "CloseDialog",
+"РазмерТекущих": "CurrentSize",
+"ID обсуждения": "Discussion ID",
+"ОткрытьДиалог": "OpenDialog",
+"Скачать папку": "Download folder",
+"Тестовый лист": "TestSheet",
+"МассивЗаказов": "ArrayOfOrders",
+"ZipРазмерEOCD": "ZipSizeEOCD",
+"СтруктураПоля": "FieldStructure",
+"РаботаСПолями": "FieldWork",
+"КартинкаПоста": "PostImage",
+"ДатаИстечения": "ExpirationDate",
+"Метод,Область": "Method,Region",
+"Массив файлов": "Files array",
+"Создать книгу": "CreateBook",
+"ID объявления": "Ad ID",
+"ЗагрузитьФайл": "UploadFile",
 "пустая строка": "empty string",
 "ТекущийСтатус": "CurrentStatus",
-"Массив кнопок": "Array of buttons",
-"ПодСообщением": "UnderMessage",
-"РазмерТекущих": "CurrentSize",
-"ЕдиницаДанных": "DataUnit",
-"Добавить лист": "AddSheet",
-"Тестовая цель": "TestGoal",
-"ОбработатьТег": "ProcessTag",
-"СоздатьКаталог": "CreateDirectory",
-"Обновить токен": "Refresh token",
-"Создать альбом": "Create album",
-"Base64Значение": "Base64Value",
-"ОтправкаДанных": "DataSending",
-"АТ_СоздатьПоле": "AT_CreateField",
-"АТ_СоздатьБазу": "AT_CreateDatabase",
-"Номер телефона": "Phone number",
-"СтрокаВложений": "AttachmentsString",
-"РаботаСБлоками": "BlockWork",
-"Тип клавиатуры": "KeyboardType",
-"СоздатьИсторию": "CreateStory",
-"РаботаСФайлами": "FileWork",
-"СтруктураЯчеек": "CellStructure",
-"СтрокаПодборок": "SelectionsString",
-"Путь к объекту": "Path to the object",
-"ОписаниеМетода": "MethodDescription",
-"КопироватьФайл": "CopyFile",
-"Закрыть диалог": "Close dialog",
-"Новое название": "New name",
-"УдалитьСобытие": "DeleteEvent",
-"Открыть диалог": "Open dialog",
-"ОписаниеОшибки": "ErrorDescription",
-"МассивИДПостов": "Array of post IDs",
-"ПараметрМетода": "MethodParameter",
-"СоздатьСобытие": "CreateEvent",
-"ТолькоПросмотр": "ViewOnly",
-"МассивОписаний": "ArrayOfDescriptions",
-"Удалить альбом": "Delete album",
-"УдалитьWebhook": "DeleteWebhook",
-"Удалить объект": "Delete object",
-"VK_СоздатьПост": "VK_CreatePost",
-"СтруктураМедиа": "MediaStructure",
-"МассивКартинок": "ImageArray",
-"ПолучитьОбъект": "GetObject",
-"Удалить записи": "Delete records",
-"СтрНачинаетсяС": "StringStartsWith",
-"Сделать репост": "Make repost",
-"Получить канал": "Get channel",
-"VK_УдалитьПост": "VK_DeletePost",
-"СтруктураФайла": "FileStructure",
-"Описание видео": "Video description",
-"ПараметрыТеста": "TestParameters",
-"ИДПользователя": "UserID",
-"КартинкаЗамены": "ReplacementImage",
-"Тестовый твитт": "TestTweet",
-"ЗапросыБезТела": "RequestsWithoutBody",
-"ЧтениеZipФайла": "ReadingZipFile",
-"Новое описание": "New description",
-"ДвоичныеДанные": "BinaryData",
-"ТекущаяКоманда": "CurrentCommand",
-"JsonВСтруктуру": "JsonToStructure",
-"ПолучитьМассив": "GetArray",
-"ФорматДатыJSON": "JSONDateFormat",
-"СоздатьТаблицу": "CreateTable",
-"ТекущаяОбласть": "CurrentRegion",
-"Поставить лайк": "Like",
-"Покинуть канал": "Leave channel",
-"ВступитьВКанал": "JoinChannel",
-"ПолноеИмяМедиа": "FullMediaName",
-"Тестовая папка": "TestFolder",
-"КонецПроцедуры": "EndProcedure",
-"Номер страницы": "Page number",
-"МаксимумПостов": "MaximumPosts",
-"МассивПодборок": "SelectionArray",
-"Проверка_Пусто": "Check_Empty",
-"СтрочныйМассив": "StringArray",
-"ПутьСохранения": "SavePath",
-"ОписаниеТовара": "ProductDescription",
-"РаботаСКнигами": "BookWork",
-"ОтправкаВКанал": "SendingToChannel",
-"Перезаписывать": "Overwrite",
-"Файл, Значение": "File, Value",
-"ПрочитанноБайт": "BytesRead",
-"HTTPСоединение": "HTTPConnection",
-"ЗаписанныйФайл": "RecordedFile",
-"ТекущаяПозиция": "CurrentPosition",
-"ТекущеВложение": "CurrentAttachment",
-"ОтправитьГифку": "SendGif",
-"МассивВложений": "AttachmentsArray",
-"Создать записи": "Create records",
-"Добавить товар": "Add product",
-"Получить токен": "Get token",
-"Получить книгу": "GetBook",
-"КлючПриложения": "AppKey",
-"РаботаСДанными": "DataWork",
-"КопироватьЛист": "CopySheet",
-"Заголовок темы": "Thread title",
-"ОтправитьОпрос": "SendPoll",
-"Библиотека: VK": "Library: VK",
-"ОчиститьЯчейки": "ClearCells",
-"РаботаСГруппой": "GroupWork",
-"СтруктураОпций": "OptionsStructure",
-"ТекущийЭлемент": "CurrentElement",
-"РаботаСЛистами": "SheetWork",
-"МассивЗапросов": "ArrayOfRequests",
-"МассивОбъектов": "ArrayOfObjects",
-"ПолучитьЗапись": "GetRecord",
-"ГлавныйВГруппе": "MainInGroup",
-"ПолучитьСостав": "GetComposition",
-"Отбор по имени": "Filter by name",
-"СтрОбщийРазмер": "StrTotalSize",
-"Загрузить файл": "Upload file",
-"МассивОписания": "DescriptionArray",
-"IDПользователя": "UserID",
-"ОтправитьАудио": "SendAudio",
-"МассивАльбомов": "ArrayOfAlbums",
-"Изменить товар": "Edit product",
-"ОтправитьВидео": "SendVideo",
-"МассивСтруктур": "Array of Structures",
-"ЗаписатьСтроку": "WriteString",
-"МассивТоваров_": "Array_of_Products",
-"Это новый файл": "This is a new file",
-"ПолучитьПревью": "GetPreview",
-"ID базы данных": "Database ID",
-"Отправить файл": "SendFile",
-"Новый файл.jpg": "New file.jpg",
-"Текстовый твит": "Text tweet",
 "ПолучитьБулево": "GetBoolean",
-"Описание файла": "File description",
-"Тестовый товар": "TestProduct",
-"Твит с опросом": "Tweet with poll",
-"ПолучитьВерсию": "GetVersion",
 "НомерКатегории": "CategoryNumber",
-"Файл документа": "Document file",
-"МассивОтправки": "SendArray",
-"ПолучитьСтроку": "GetLine",
+"ИДПользователя": "UserID",
+"МассивТоваров_": "Array_of_Products",
+"Base64Значение": "Base64Value",
+"МассивОписания": "DescriptionArray",
+"СоздатьСобытие": "CreateEvent",
+"Изменить товар": "Edit product",
+"СтруктураФайла": "FileStructure",
+"ОписаниеТовара": "ProductDescription",
+"Перезаписывать": "Overwrite",
+"ТекущийЭлемент": "CurrentElement",
+"ПолучитьЗапись": "GetRecord",
+"Загрузить файл": "Upload file",
+"МассивСтруктур": "Array of Structures",
+"МассивКартинок": "ImageArray",
+"Добавить товар": "Add product",
+"АТ_СоздатьБазу": "AT_CreateDatabase",
+"СтрочныйМассив": "StringArray",
+"МассивПодборок": "SelectionArray",
 "ОписаниеЗаписи": "RecordDescription",
-"АтомарныеТесты": "AtomicTests",
+"МассивОтправки": "SendArray",
+"КартинкаЗамены": "ReplacementImage",
+"Тестовая папка": "TestFolder",
+"Новое описание": "New description",
+"IDПользователя": "UserID",
+"ПолучитьОбъект": "GetObject",
+"Проверка_Пусто": "Check_Empty",
+"ОтправитьОпрос": "SendPoll",
+"СтруктураОпций": "OptionsStructure",
+"УдалитьWebhook": "DeleteWebhook",
+"Заголовок темы": "Thread title",
+"Тестовый товар": "TestProduct",
+"Удалить записи": "Delete records",
 "ФайлСтатистики": "StatisticsFile",
 "РабочийКаталог": "WorkingDirectory",
-"Создать таблицу": "Create table",
-"ФайлРепозитория": "RepositoryFile",
-"ЗагруженныйФайл": "UploadedFile",
-"ЗаписатьЦелое32": "WriteInt32",
-"Команда CLI: vk": "CLI Command: vk",
-"ОригиналныйПуть": "OriginalPath",
-"СтатусСообщения": "MessageStatus",
-"ПолучитьСобытие": "GetEvent",
-"ЗаголовокПотока": "StreamHeader",
-"перенаправления": "redirection",
-"Создать событие": "Create event",
-"УдалитьКартинку": "DeleteImage",
-"OPI_Инструменты": "OPI_Tools",
-"УстановитьТекст": "SetText",
-"ЗначенияСвойств": "PropertyValues",
-"ТокенВЗаголовки": "TokenInHeaders",
-"ОписаниеСобытия": "EventDescription",
-"ИскомыйПараметр": "DesiredParameter",
+"ОтправкаДанных": "DataSending",
+"Файл, Значение": "File, Value",
+"Создать записи": "Create records",
+"ОтправитьГифку": "SendGif",
+"VK_УдалитьПост": "VK_DeletePost",
+"Файл документа": "Document file",
+"VK_СоздатьПост": "VK_CreatePost",
+"ПараметрыТеста": "TestParameters",
+"ОтправитьВидео": "SendVideo",
+"ПолучитьМассив": "GetArray",
+"ПолучитьПревью": "GetPreview",
+"КлючПриложения": "AppKey",
+"СтруктураЯчеек": "CellStructure",
+"ПолучитьСтроку": "GetLine",
+"Путь к объекту": "Path to the object",
+"СтрНачинаетсяС": "StringStartsWith",
+"АтомарныеТесты": "AtomicTests",
+"КопироватьФайл": "CopyFile",
+"СтруктураМедиа": "MediaStructure",
+"ПолноеИмяМедиа": "FullMediaName",
+"ГлавныйВГруппе": "MainInGroup",
+"Обновить токен": "Refresh token",
+"ТекущаяПозиция": "CurrentPosition",
+"МассивОписаний": "ArrayOfDescriptions",
+"ФорматДатыJSON": "JSONDateFormat",
+"СоздатьТаблицу": "CreateTable",
+"АТ_СоздатьПоле": "AT_CreateField",
+"СтрокаПодборок": "SelectionsString",
+"Получить канал": "Get channel",
+"МаксимумПостов": "MaximumPosts",
+"ВступитьВКанал": "JoinChannel",
+"Покинуть канал": "Leave channel",
+"Новое название": "New name",
+"Получить токен": "Get token",
+"Тестовый твитт": "TestTweet",
+"Открыть диалог": "Open dialog",
+"Закрыть диалог": "Close dialog",
+"РаботаСФайлами": "FileWork",
+"Номер страницы": "Page number",
+"МассивАльбомов": "ArrayOfAlbums",
+"Текстовый твит": "Text tweet",
+"Тип клавиатуры": "KeyboardType",
+"ОтправитьАудио": "SendAudio",
+"ПолучитьВерсию": "GetVersion",
+"РаботаСДанными": "DataWork",
+"КопироватьЛист": "CopySheet",
+"ID базы данных": "Database ID",
+"Создать альбом": "Create album",
+"ПутьСохранения": "SavePath",
+"Библиотека: VK": "Library: VK",
+"Удалить объект": "Delete object",
+"Отправить файл": "SendFile",
+"РаботаСГруппой": "GroupWork",
+"СтрОбщийРазмер": "StrTotalSize",
+"Сделать репост": "Make repost",
+"ЧтениеZipФайла": "ReadingZipFile",
+"ЗаписатьСтроку": "WriteString",
+"ОтправкаВКанал": "SendingToChannel",
+"МассивОбъектов": "ArrayOfObjects",
+"СоздатьИсторию": "CreateStory",
+"ПолучитьСостав": "GetComposition",
+"ОписаниеОшибки": "ErrorDescription",
+"Поставить лайк": "Like",
+"ПрочитанноБайт": "BytesRead",
+"РаботаСКнигами": "BookWork",
+"РаботаСЛистами": "SheetWork",
+"МассивВложений": "AttachmentsArray",
+"МассивЗапросов": "ArrayOfRequests",
+"ТекущеВложение": "CurrentAttachment",
+"СтрокаВложений": "AttachmentsString",
+"СоздатьКаталог": "CreateDirectory",
+"Получить книгу": "GetBook",
+"Описание видео": "Video description",
+"Удалить альбом": "Delete album",
+"КонецПроцедуры": "EndProcedure",
+"Номер телефона": "Phone number",
+"HTTPСоединение": "HTTPConnection",
+"Описание файла": "File description",
+"ПараметрМетода": "MethodParameter",
+"Твит с опросом": "Tweet with poll",
+"МассивИДПостов": "Array of post IDs",
+"Новый файл.jpg": "New file.jpg",
+"ДвоичныеДанные": "BinaryData",
+"УдалитьСобытие": "DeleteEvent",
+"ТолькоПросмотр": "ViewOnly",
+"Это новый файл": "This is a new file",
+"ТекущаяКоманда": "CurrentCommand",
+"ОписаниеМетода": "MethodDescription",
+"Отбор по имени": "Filter by name",
+"ЗаписанныйФайл": "RecordedFile",
+"ОчиститьЯчейки": "ClearCells",
+"JsonВСтруктуру": "JsonToStructure",
+"РаботаСБлоками": "BlockWork",
+"ЗапросыБезТела": "RequestsWithoutBody",
+"ТекущаяОбласть": "CurrentRegion",
+"ОписаниеСтроки1": "RowDescription1",
+"НужнаРаспаковка": "NeedsUnpacking",
 "ПолучитьТаблицу": "GetTable",
-"Копировать лист": "CopySheet",
-"Получить запись": "Get record",
-"Загрузить видео": "Upload video",
 "ЗапросИзменения": "ChangeRequest",
-"Описание товара": "Product description",
-"IDПользователей": "UserIDs",
-"РаботаСЗаписями": "RecordManagement",
-"ТекущееЗначение": "CurrentValue",
-"ДобавитьКоманду": "AddCommand",
-"ДвоичныеДанные2": "BinaryData2",
-"СтруктураКнопки": "ButtonStructure",
 "Создать историю": "Create story",
-"МестоПроведения": "Venue",
-"ТекущаяДатаUNIX": "CurrentUNIXDate",
-"ВводныйПараметр": "IntroductoryParameter",
-"РаботаСКаналами": "ChannelManagement",
-"ОписаниеТаблицы": "TableDescription",
-"Telegram_Разбан": "Telegram_Unban",
-"Проверка_СлакОк": "Check_SlackOk",
-"ВК_СоздатьОпрос": "VK_CreatePoll",
-"JSON клавиатуры": "Keyboard JSON",
-"ПолучитьАккаунт": "GetAccount",
-"МассивРодителей": "ArrayOfParents",
-"Перенаправление": "Redirection",
-"РаботаСЗаказами": "OrderManagement",
-"ДвоичныеДанные1": "BinaryData1",
-"ЗависимостиГугл": "GoogleDependencies",
-"ПолучениеТокена": "TokenRetrieval",
-"VK_СоздатьОпрос": "VK_CreatePoll",
+"Очистить ячейки": "Clear cells",
 "СтрокаСигнатуры": "SignatureString",
-"Текст сообщения": "Message text",
+"Создать таблицу": "Create table",
+"Картинка опроса": "Poll image",
+"ТекущаяДатаUNIX": "CurrentUNIXDate",
+"Проверка_СлакОк": "Check_SlackOk",
+"ЗначениеСтрокой": "ValueAsString",
+"OPI_Инструменты": "OPI_Tools",
+"МестоПроведения": "Venue",
+"УдалитьПодборку": "DeleteSelection",
+"КоллекцияТаблиц": "TableCollection",
+"Удалить событие": "Delete event",
+"ЗагруженныйФайл": "UploadedFile",
+"Новый заголовок": "New title",
+"ТекстВыполнения": "ExecutionText",
+"КодировкаТекста": "TextEncoding",
 "Вспомогательные": "Auxiliary",
+"Копировать лист": "CopySheet",
+"РаботаСЗаказами": "OrderManagement",
+"СтатусСообщения": "MessageStatus",
+"Перенаправление": "Redirection",
+"Ключ приложения": "Application key",
+"ТаблицаЗначений": "ValueTable",
+"РаботаСЗаписями": "RecordManagement",
+"Получить запись": "Get record",
+"ТипСоответствие": "TypeMatch",
 "СтруктураФайлов": "FileStructure",
+"Каждого,каждого": "Each,each",
+"ОтправитьСсылку": "SendLink",
+"Отправить гифку": "Send GIF",
+"VK_СоздатьОпрос": "VK_CreatePoll",
+"ВК_СоздатьОпрос": "VK_CreatePoll",
+"МассивРодителей": "ArrayOfParents",
+"СтруктураКнопки": "ButtonStructure",
+"Отправить видео": "Send video",
+"МобильныйКлиент": "MobileClient",
+"Telegram_Разбан": "Telegram_Unban",
+"перенаправления": "redirection",
+"Отправить аудио": "Send audio",
+"ДвоичныеДанные2": "BinaryData2",
+"ТокенВЗаголовки": "TokenInHeaders",
+"ДвоичныеДанные1": "BinaryData1",
+"Удалить Webhook": "Delete webhook",
+"IDПользователей": "UserIDs",
+"установлен свой": "set your",
+"ОписаниеТаблицы": "TableDescription",
 "МассивУдаляемых": "ArrayOfDeletions",
-"СоздатьСтраницу": "CreatePage",
+"ДобавитьКоманду": "AddCommand",
+"ИзменитьТаблицу": "ModifyTable",
+"Получить объект": "Get object",
+"Массив картинок": "Array of images",
+"JSON клавиатуры": "Keyboard JSON",
+"ОписаниеКоманды": "CommandDescription",
+"ЗаголовокПотока": "StreamHeader",
+"ПолучениеТокена": "TokenRetrieval",
+"Команда CLI: vk": "CLI Command: vk",
+"ТекущееЗначение": "CurrentValue",
+"ЗаписатьЦелое32": "WriteInt32",
+"ЗаписатьЦелое16": "WriteInt16",
+"Отправить опрос": "Send poll",
+"ПовторитьСтроку": "RepeatString",
+"Номер,Строковое": "Number,String",
+"ПараметрыМетода": "MethodParameters",
+"РаботаСКаналами": "ChannelManagement",
+"СтатусОбработки": "ProcessingStatus",
+"ОписаниеСобытия": "EventDescription",
+"ОписаниеСтроки2": "RowDescription2",
+"Описание товара": "Product description",
 "ПеременнаяСреды": "EnvironmentVariable",
 "Получить превью": "Get preview",
-"ТекущееОписание": "CurrentDescription",
-"ТипСоответствие": "TypeMatch",
-"ID пользователя": "User ID",
-"ТекстВыполнения": "ExecutionText",
-"ПреобразоватьИД": "ConvertID",
-"ЗавершитьРаботу": "FinishWork",
-"МассивВариантов": "OptionArray",
-"НужнаРаспаковка": "NeedsUnpacking",
-"СтруктураТекста": "TextStructure",
-"СтруктураДанных": "DataStructure",
-"ТаблицаЗначений": "ValueTable",
-"Отправить гифку": "Send GIF",
-"Новый заголовок": "New title",
-"Проверка_ВКПост": "Check_VKPost",
-"установлен свой": "set your",
-"Отправить видео": "Send video",
-"ИзменитьТаблицу": "ModifyTable",
-"Отправить аудио": "Send audio",
-"Массив картинок": "Array of images",
-"Удалить событие": "Delete event",
-"ИзменитьСобытие": "EditEvent",
-"Массив ID медиа": "Media ID array",
 "IDИнициализации": "InitializationID",
-"СократитьСсылку": "ShortenLink",
-"СтатусОбработки": "ProcessingStatus",
-"Сокращенный URL": "Shortened URL",
-"КодировкаТекста": "TextEncoding",
-"Удалить Webhook": "Delete webhook",
-"ID целевой базы": "Target database ID",
-"Отправить опрос": "Send poll",
-"Получить объект": "Get object",
-"ПовторитьСтроку": "RepeatString",
-"СтруктураВыбора": "ChoiceStructure",
-"ЗаписатьЦелое16": "WriteInt16",
-"ОбработатьОтвет": "ProcessResponse",
-"Ключ приложения": "Application key",
-"ОписаниеСтроки2": "RowDescription2",
-"Номер,Строковое": "Number,String",
-"ОдиночнаяЗапись": "SingleRecord",
-"Картинка опроса": "Poll image",
-"ОписаниеСтроки1": "RowDescription1",
-"Очистить ячейки": "Clear cells",
-"ОтправитьСсылку": "SendLink",
-"ПараметрыМетода": "MethodParameters",
-"РаботаСТоварами": "ProductManagement",
+"ПреобразоватьИД": "ConvertID",
+"Текст сообщения": "Message text",
+"ПолучитьСобытие": "GetEvent",
 "ЗначениеВМассив": "ValueToArray",
-"ОписаниеКоманды": "CommandDescription",
+"УстановитьТекст": "SetText",
+"ID пользователя": "User ID",
+"СоздатьСтраницу": "CreatePage",
+"Создать событие": "Create event",
+"УдалитьКартинку": "DeleteImage",
+"СтруктураВыбора": "ChoiceStructure",
+"Массив ID медиа": "Media ID array",
+"ИзменитьСобытие": "EditEvent",
+"Загрузить видео": "Upload video",
+"ТекущееОписание": "CurrentDescription",
 "Создать каталог": "Create folder",
-"ЗначениеСтрокой": "ValueAsString",
-"КоллекцияТаблиц": "TableCollection",
-"УдалитьПодборку": "DeleteSelection",
-"ДанныеИНастройка": "DataAndSettings",
-"МассивКлавиатуры": "KeyboardArray",
+"СтруктураДанных": "DataStructure",
+"СтруктураТекста": "TextStructure",
+"ОригиналныйПуть": "OriginalPath",
+"СократитьСсылку": "ShortenLink",
+"Сокращенный URL": "Shortened URL",
+"ИскомыйПараметр": "DesiredParameter",
+"ЗависимостиГугл": "GoogleDependencies",
+"ЗавершитьРаботу": "FinishWork",
+"ID целевой базы": "Target database ID",
+"РаботаСТоварами": "ProductManagement",
+"МассивВариантов": "OptionArray",
+"ПолучитьАккаунт": "GetAccount",
+"ФайлРепозитория": "RepositoryFile",
+"ЗначенияСвойств": "PropertyValues",
+"ОдиночнаяЗапись": "SingleRecord",
+"ОбработатьОтвет": "ProcessResponse",
+"Проверка_ВКПост": "Check_VKPost",
+"ВводныйПараметр": "IntroductoryParameter",
+"ПолучитьФайлПути": "GetFilePath",
 "СоздатьКалендарь": "CreateCalendar",
-"ЗапросыMultipart": "MultipartRequests",
-"ОбработатьОбъект": "ProcessObject",
-"ГВ_ОбновитьТокен": "GV_UpdateToken",
-"ГВ_ПолучитьТокен": "GV_GetToken",
-"ЗаписатьПараметр": "WriteParameter",
-"СоставБиблиотеки": "LibraryComposition",
-"ID целевого чата": "Target chat ID",
-"РаботаССобытиями": "EventManagement",
-"ОсвободитьОбъект": "ReleaseObject",
-"МаксимумВЗапросе": "MaxInRequest",
-"Получить таблицу": "Get table",
-"МассивКалендарей": "ArrayOfCalendars",
-"Описание альбома": "Album description",
-"ЗапятаяВКавычках": "CommaInQuotes",
-"СтрокаФотографий": "PhotoString",
-"Тестовый товар 2": "TestProduct2",
-"Коллекция файлов": "File collection",
-"Фамилия контакта": "Contact last name",
-"РаспаковатьОтвет": "UnpackResponse",
-"УдалитьКалендарь": "DeleteCalendar",
-"ПривестиЗначение": "ConvertValue",
+"Расширение файла": "File extension",
+"ОтправитьКонтакт": "SendContact",
+"ЗначениеОсновной": "MainValue",
+"ОписаниеКартинки": "ImageDescription",
 "КоличествоЧастей": "NumberOfParts",
 "Телефон контакта": "Contact phone number",
-"ПрочитатьЦелое32": "ReadInt32",
-"МБ был записан в": "MB was recorded in",
-"VK_УдалитьАльбом": "VK_DeleteAlbum",
-"ОтправитьКонтакт": "SendContact",
-"OPI_Криптография": "OPI_Cryptography",
-"ПолучитьПараметр": "GetParameter",
-"Тестовая таблица": "TestTable",
-"превью документа": "document preview",
-"СледующаяПозиция": "NextPosition",
-"СсылкаПодЗаписью": "LinkUnderPost",
-"Отправить ссылку": "SendLink",
-"ВызватьHTTPМетод": "CallHTTPMethod",
-"СтруктураФормата": "FormatStructure",
-"ОбъектПроцессора": "ProcessorObject",
-"ДоступныйОстаток": "AvailableBalance",
-"KeyИнициализации": "InitializationKey",
-"Неактивный : red": "Inactive    : red",
-"СоответствиеMIME": "MIMETypeMapping",
-"СтрокаПараметров": "ParameterString",
-"УстановитьСтроку": "SetString",
-"МассивСтатистики": "Array of Statistics",
-"Канал для отбора": "Channel for selection",
-"ОписаниеКартинки": "ImageDescription",
-"ПараметрыФункции": "FunctionParameters",
-"Массив ID постов": "Array of post IDs",
-"ЗначениеОсновной": "MainValue",
-"СоздатьТвитОпрос": "CreatePollTweet",
-"Расширение файла": "File extension",
-"Изменить событие": "Edit event",
-"Изменить таблицу": "Modify table",
-"СоздатьТвитВидео": "CreateVideoTweet",
-"РазделительСтрок": "LineSeparator",
-"СоздатьТвитГифки": "CreateGifTweet",
-"ЮнитТестирование": "UnitTesting",
-"ЗапускаемыеТесты": "RunnableTests",
-"СтруктураСтатуса": "StatusStructure",
+"Фамилия контакта": "Contact last name",
 "Сократить ссылку": "Shorten link",
-"ПолучитьПолеДаты": "GetDateField",
-"ПолучитьСтраницу": "GetPage",
+"ДобавитьПараметр": "AddParameter",
+"ПолучитьДвоичные": "GetBinary",
+"ДобавитьИмяЛиста": "AddSheetName",
+"Тестовый товар 2": "TestProduct2",
+"HTTPСервисЗапрос": "HTTPServiceRequest",
 "ПутьКФайлуДанных": "DataFilePath",
-"Твит с картинкой": "Tweet with image",
-"ЭлементКоллекции": "CollectionItem",
+"СоответствиеMIME": "MIMETypeMapping",
+"ЗаписатьФайлЛога": "WriteLogFile",
+"УправлениеФайлом": "FileManagement",
 "URLВКодировкеURL": "URLInURLEncoding",
-"КонецКодовУспеха": "EndOfSuccessCodes",
-"МассивИнформации": "ArrayOfInformation",
-"НеобходимоЧастей": "PartsRequired",
+"СтруктураСтатуса": "StatusStructure",
+"KeyИнициализации": "InitializationKey",
+"СекретПриложения": "AppSecret",
+"ВладелецКартинки": "ImageOwner",
+"ПараметрыЗапроса": "RequestParameters",
+"СмещениеОтНачала": "OffsetFromStart",
+"СсылкаПодЗаписью": "LinkUnderPost",
+"ЗаписатьПараметр": "WriteParameter",
+"ГВ_ПолучитьТокен": "GV_GetToken",
+"Неактивный : red": "Inactive    : red",
 "КодироватьСтроку": "EncodeString",
+"СтруктураФормата": "FormatStructure",
+"КонецКодовУспеха": "EndOfSuccessCodes",
+"Твит с картинкой": "Tweet with image",
+"Получить таблицу": "Get table",
+"Code из браузера": "Code from browser",
+"СоздатьТвитГифки": "CreateGifTweet",
+"МассивСтатистики": "Array of Statistics",
+"СтрокаПараметров": "ParameterString",
+"СоздатьТвитВидео": "CreateVideoTweet",
+"РаспаковатьОтвет": "UnpackResponse",
+"УдалитьКалендарь": "DeleteCalendar",
+"МетодХэширования": "HashingMethod",
+"VK_СоздатьАльбом": "VK_CreateAlbum",
+"ЗапускаемыеТесты": "RunnableTests",
+"VK_УдалитьАльбом": "VK_DeleteAlbum",
+"ЮнитТестирование": "UnitTesting",
+"СоздатьТвитОпрос": "CreatePollTweet",
+"Коллекция файлов": "File collection",
+"Изменить событие": "Edit event",
+"Отправить ссылку": "SendLink",
+"НеобходимаяДлина": "RequiredLength",
+"МассивКалендарей": "ArrayOfCalendars",
+"ВызватьHTTPМетод": "CallHTTPMethod",
+"ЗапросыMultipart": "MultipartRequests",
+"ОтправитьЛокацию": "SendLocation",
+"МассивРазрешений": "Permissions array",
+"ОбъектПроцессора": "ProcessorObject",
+"OPI_Криптография": "OPI_Cryptography",
+"ДоступныйОстаток": "AvailableBalance",
+"ПолучитьПараметр": "GetParameter",
+"СоставБиблиотеки": "LibraryComposition",
+"ПолучитьПолеДаты": "GetDateField",
+"ГВ_ОбновитьТокен": "GV_UpdateToken",
+"Массив ID постов": "Array of post IDs",
+"Описание события": "Event description",
+"превью документа": "document preview",
+"МассивПараметров": "ParameterArray",
+"Описание таблицы": "Table description",
+"РаботаССобытиями": "EventManagement",
+"МБ был записан в": "MB was recorded in",
+"ДанныеИНастройка": "DataAndSettings",
+"СледующаяПозиция": "NextPosition",
+"КопироватьОбъект": "CopyObject",
+"Удалить картинку": "Delete image",
+"Создать страницу": "Create page",
+"ПолучитьСтраницу": "GetPage",
+"Канал для отбора": "Channel for selection",
+"Массив Из Строка": "Array Of String",
+"ЭлементКоллекции": "CollectionItem",
+"Удалить подборку": "DeleteSelection",
+"РаботаСТаблицами": "TableManagement",
+"ИмяФайлаОтправки": "SendingFileName",
+"ПереносСтрокJSON": "JSONLineBreak",
+"УстановитьСтроку": "SetString",
+"ИсходноеЗначение": "InitialValue",
+"РаботаСДиалогами": "DialogManagement",
+"ЗапятаяВКавычках": "CommaInQuotes",
+"Получить событие": "Get event",
+"ПараметрыФункции": "FunctionParameters",
+"Описание альбома": "Album description",
+"ПривестиЗначение": "ConvertValue",
+"РазделительСтрок": "LineSeparator",
+"ЭтоПереадресация": "ThisIsRedirection",
+"Вступить в канал": "Join channel",
+"Тестовая таблица": "TestTable",
+"УдалитьСообщение": "DeleteMessage",
+"МассивКлавиатуры": "KeyboardArray",
+"Изменить таблицу": "Modify table",
+"ЗагрузкаКартинки": "ImageUpload",
+"УдалитьПолностью": "Delete completely",
+"ВыгрузитьКолонку": "UnloadColumn",
+"НеобходимоЧастей": "PartsRequired",
+"МассивИнформации": "ArrayOfInformation",
+"ID целевого чата": "Target chat ID",
+"ОсвободитьОбъект": "ReleaseObject",
+"СтрокаФотографий": "PhotoString",
 "МассивИменЛистов": "ArrayOfSheetNames",
 "Массив из Строка": "Array of Strings",
-"ИмяФайлаОтправки": "SendingFileName",
-"МетодХэширования": "HashingMethod",
-"УправлениеФайлом": "FileManagement",
+"ОбработатьОбъект": "ProcessObject",
+"ПрочитатьЦелое32": "ReadInt32",
 "Загружаемый файл": "File to be uploaded",
-"КопироватьОбъект": "CopyObject",
-"ВладелецКартинки": "ImageOwner",
-"НеобходимаяДлина": "RequiredLength",
-"ДобавитьПараметр": "AddParameter",
-"ДобавитьИмяЛиста": "AddSheetName",
-"ЗагрузкаКартинки": "ImageUpload",
-"Code из браузера": "Code from browser",
-"МассивРазрешений": "Permissions array",
-"ПереносСтрокJSON": "JSONLineBreak",
-"Создать страницу": "Create page",
-"СекретПриложения": "AppSecret",
-"СмещениеОтНачала": "OffsetFromStart",
-"Удалить подборку": "DeleteSelection",
-"Описание таблицы": "Table description",
-"ПолучитьДвоичные": "GetBinary",
-"Вступить в канал": "Join channel",
-"ЭтоПереадресация": "ThisIsRedirection",
-"ПараметрыЗапроса": "RequestParameters",
-"ИсходноеЗначение": "InitialValue",
-"РаботаСТаблицами": "TableManagement",
-"ОтправитьЛокацию": "SendLocation",
-"Описание события": "Event description",
-"ВыгрузитьКолонку": "UnloadColumn",
-"МассивПараметров": "ParameterArray",
-"Массив Из Строка": "Array Of String",
-"VK_СоздатьАльбом": "VK_CreateAlbum",
-"РаботаСДиалогами": "DialogManagement",
-"HTTPСервисЗапрос": "HTTPServiceRequest",
-"ПолучитьФайлПути": "GetFilePath",
-"ЗаписатьФайлЛога": "WriteLogFile",
-"УдалитьСообщение": "DeleteMessage",
-"Получить событие": "Get event",
-"Удалить картинку": "Delete image",
-"УдалитьПолностью": "Delete completely",
-"СтруктураЗначений": "ValueStructure",
-"ГД_СоздатьКаталог": "GD_CreateCatalog",
-"Наш первый клиент": "OurFirstClient",
-"УстановитьКоманду": "SetCommand",
-"НаправлениеПоиска": "SearchDirection",
-"Наименование поля": "Field name",
-"АрхивироватьКанал": "ArchiveChannel",
-"ОтправкаСообщений": "MessageSending",
-"Отправить контакт": "Send contact",
-"ПолучитьПолеПочты": "GetEmailField",
-"Путь или ID файла": "Path or ID of the file",
-"Картинка автотест": "AutoTestImage",
-"Данные для API v2": "Data for API v2",
-"МассивРезультатов": "ResultArray",
-"Значение свойства": "Property value",
-"Секрет приложения": "Application secret",
-"СохранятьЛокально": "SaveLocally",
-"Получить страницу": "Get page",
-"Проверка_ВайберОк": "Check_ViberOk",
-"VK_СоздатьИсторию": "VK_CreateStory",
-"СоздатьТемуФорума": "CreateForumThread",
-"ХешированиеДанных": "DataHashing",
-"ВК_ЗагрузитьВидео": "VK_UploadVideo",
-"ПолучитьКоллекцию": "GetCollection",
-"Массив ID товаров": "Array of product IDs",
-"ПереместитьОбъект": "MoveObject",
-"СтруктураВозврата": "ReturnStructure",
-"Файл для загрузки": "File for upload",
-"Копировать объект": "Copy object",
-"Тестовая подборка": "TestCollection",
-"ВызватьИсключение": "RaiseException",
-"СтандартныйСпособ": "StandardMethod",
-"СкопироватьОбъект": "CopyObject",
-"Новое имя объекта": "New object name",
-"Проверка_ВКИстина": "Check_VKTrue",
-"СоответствиеФайла": "FileMapping",
+"МаксимумВЗапросе": "MaxInRequest",
+"При отправке  URL": "When sending URL",
 "Библиотека: Viber": "Library: Viber",
-"РезультатПроверки": "CheckResult",
-"УправлениеТоваром": "ProductManagement",
+"ПереместитьОбъект": "MoveObject",
+"СортироватьПоДате": "SortByDate",
+"ОткрытьТемуФорума": "OpenForumThread",
+"ОтправкаСообщений": "MessageSending",
+"Значение свойства": "Property value",
+"УдалитьТемуФорума": "DeleteForumTopic",
+"Название свойства": "Property name",
+"Копировать объект": "Copy object",
 "Администрирование": "Administration",
+"ОтправитьДокумент": "SendDocument",
+"ЗакрытьТемуФорума": "CloseForumThread",
+"Строка, Структура": "String, Structure",
+"СоздатьСоединение": "CreateConnection",
+"Текст комментария": "Comment text",
+"ЭлементСтатистики": "StatisticsItem",
+"КаталогИсходников": "SourceDirectory",
+"ОпросСоответствие": "PollCorrespondence",
+"Название подборки": "Selection name",
+"Данные для API v2": "Data for API v2",
+"ID целевого поста": "ID of the target post",
+"СтандартныйСпособ": "StandardMethod",
+"УстановитьКоманду": "SetCommand",
+"Массив ID товаров": "Array of product IDs",
+"НаписатьСообщение": "WriteMessage",
+"Отправить контакт": "Send contact",
+"СоздатьТемуФорума": "CreateForumThread",
+"СоздатьОбсуждение": "CreateDiscussion",
+"Описание картинки": "Image description",
+"Путь или ID файла": "Path or ID of the file",
+"ОтветСоответствие": "ResponseCorrespondence",
+"ЗакрытьОбсуждение": "CloseDiscussion",
+"УправлениеТоваром": "ProductManagement",
+"Создать календарь": "Create calendar",
+"СтруктураВарианта": "OptionStructure",
+"ОткрытьОбсуждение": "OpenDiscussion",
+"Секрет приложения": "Application secret",
+"СтруктураКампании": "CampaignStructure",
+"Отправить локацию": "SendLocation",
+"ОпубликоватьПапку": "PublishFolder",
+"Скрытый календарь": "Hidden calendar",
+"ГД_СоздатьКаталог": "GD_CreateCatalog",
+"ТекстовыйДокумент": "TextDocument",
+"ГТ_СоздатьТаблицу": "GT_CreateTable",
+"МассивРезультатов": "ResultArray",
+"Наш первый клиент": "OurFirstClient",
+"Библиотека: Slack": "Library: Slack",
+"МаксимальнаяДлина": "MaximumLength",
+"СтруктураРодителя": "ParentStructure",
+"СоответствиеПолей": "FieldMapping",
+"Новый комментарий": "NewComment",
+"ВК_ЗагрузитьВидео": "VK_UploadVideo",
+"ОбъектКомментарий": "CommentObject",
+"ЗначениеПараметра": "ParameterValue",
+"СтруктураВозврата": "ReturnStructure",
+"СтруктураЗначений": "ValueStructure",
+"АрхивироватьКанал": "ArchiveChannel",
+"Получить страницу": "Get page",
+"Картинка автотест": "AutoTestImage",
+"Проверка_ВайберОк": "Check_ViberOk",
+"ПолучитьСписокБаз": "GetListOfBases",
+"ЗначениеЛокальный": "LocalValue",
+"КалендарьИсточник": "SourceCalendar",
+"Проверка_ГКОбъект": "Check_GKObject",
+"ЗаполняемыеДанные": "FillableData",
+"СохранятьЛокально": "SaveLocally",
+"КалендарьПриемник": "TargetCalendar",
+"Тестовое описание": "TestDescription",
+"ПараметрЛокальный": "LocalParameter",
+"МинимальныйРазмер": "MinimumSize",
+"Дата       : date": "Date        : date",
+"ПолучитьКоллекцию": "GetCollection",
+"ПрочитатьJSONФайл": "ReadJSONFile",
+"СоздатьБазуДанных": "CreateDatabase",
+"Имя файла в Slack": "File name in Slack",
+"ID блока родителя": "Parent block ID",
+"ВызватьИсключение": "Raise",
+"ПреобразоватьДату": "ConvertDate",
+"ВыходнаяКоллекция": "OutputCollection",
+"ОсновнаяСтруктура": "MainStructure",
+"УстановитьWebhook": "SetWebhook",
+"РезультатПроверки": "CheckResult",
+"НеВосстанавливать": "DoNotRestore",
+"СоответствиеФайла": "FileMapping",
+"ХешированиеДанных": "DataHashing",
+"ПоследняяФигурная": "LastCurly",
+"VK_СоздатьИсторию": "VK_CreateStory",
+"НачальнаяФигурная": "InitialCurly",
+"ВК_СоздатьИсторию": "VK_CreateStory",
+"УдалитьОбработчик": "RemoveHandler",
+"Новое имя объекта": "New object name",
+"СкопироватьОбъект": "CopyObject",
+"ОтправитьКартинку": "SendImage",
+"Удалить календарь": "Delete calendar",
+"ВнешнееСоединение": "ExternalConnection",
+"ТаблицаПараметров": "ParametersTable",
 "НачалоКодовОшибок": "StartOfErrorCodes",
 "КонецКодовПадений": "EndOfFailureCodes",
-"НачалоКодовУспеха": "StartOfSuccessCodes",
-"ПрочитатьJSONФайл": "ReadJSONFile",
-"Скрытый календарь": "Hidden calendar",
-"ВК_СоздатьИсторию": "VK_CreateStory",
-"СообщитьРезультат": "ReportResult",
-"Тестовая кампания": "TestCampaign",
-"СортироватьПоДате": "SortByDate",
-"ОсновноеИзмерение": "MajorDimension",
-"ЗначениеЗаполнено": "ValueFilled",
-"НеВосстанавливать": "DoNotRestore",
-"ЗначениеПараметра": "ParameterValue",
-"Описание картинки": "Image description",
+"Файл для загрузки": "File for upload",
 "ЗагруженныеДанные": "UploadedData",
-"ТекстовыйДокумент": "TextDocument",
-"Имя файла в Slack": "File name in Slack",
-"ВыходнаяКоллекция": "OutputCollection",
-"Отправить локацию": "SendLocation",
-"ПолучитьСписокБаз": "GetListOfBases",
-"МаксимальнаяДлина": "MaximumLength",
-"ПреобразоватьДату": "ConvertDate",
-"Тестовое описание": "TestDescription",
-"Название подборки": "Selection name",
-"ID блока родителя": "Parent block ID",
-"Проверка_ГКОбъект": "Check_GKObject",
-"СтруктураВарианта": "OptionStructure",
-"ОткрытьТемуФорума": "OpenForumThread",
-"УдалитьТемуФорума": "DeleteForumTopic",
-"Пост из автотеста": "Post from autotest",
-"Строка, Структура": "String, Structure",
-"При отправке  URL": "When sending URL",
-"ЗначениеЛокальный": "LocalValue",
-"ОткрытьОбсуждение": "OpenDiscussion",
-"СтруктураРодителя": "ParentStructure",
-"ID целевого поста": "ID of the target post",
-"МинимальныйРазмер": "MinimumSize",
-"УстановитьWebhook": "SetWebhook",
-"Удалить календарь": "Delete calendar",
-"Название свойства": "Property name",
-"НаписатьСообщение": "WriteMessage",
-"КалендарьПриемник": "TargetCalendar",
-"ГТ_СоздатьТаблицу": "GT_CreateTable",
-"ТаблицаПараметров": "ParametersTable",
-"ЗаполняемыеДанные": "FillableData",
-"ОсновнаяСтруктура": "MainStructure",
-"СоответствиеПолей": "FieldMapping",
-"Проверка_ВКАльбом": "Check_VKAlbum",
-"ПараметрЛокальный": "LocalParameter",
-"ОтправитьДокумент": "SendDocument",
-"КаталогИсходников": "SourceDirectory",
+"Проверка_ВКИстина": "Check_VKTrue",
+"Наименование поля": "Field name",
+"ОсновноеИзмерение": "MajorDimension",
+"Тестовая подборка": "TestCollection",
 "АТ_СоздатьТаблицу": "AT_CreateTable",
-"ПоследняяФигурная": "LastCurly",
-"СоздатьБазуДанных": "CreateDatabase",
-"СтруктураКампании": "CampaignStructure",
-"Создать календарь": "Create calendar",
-"НачальнаяФигурная": "InitialCurly",
-"ОтветСоответствие": "ResponseCorrespondence",
-"Удалить сообщение": "Delete message",
-"ОпубликоватьПапку": "PublishFolder",
+"СообщитьРезультат": "ReportResult",
+"ЗначениеЗаполнено": "ValueFilled",
+"НачалоКодовУспеха": "StartOfSuccessCodes",
+"Тестовая кампания": "TestCampaign",
+"НаправлениеПоиска": "SearchDirection",
+"Проверка_ВКАльбом": "Check_VKAlbum",
 "ИзменитьСообщение": "EditMessage",
-"Дата       : date": "Date        : date",
-"СоздатьСоединение": "CreateConnection",
-"ЗакрытьТемуФорума": "CloseForumThread",
-"Новый комментарий": "NewComment",
-"КалендарьИсточник": "SourceCalendar",
-"СоздатьОбсуждение": "CreateDiscussion",
-"ЭлементСтатистики": "StatisticsItem",
-"ОпросСоответствие": "PollCorrespondence",
-"ЗакрытьОбсуждение": "CloseDiscussion",
-"ОтправитьКартинку": "SendImage",
-"Библиотека: Slack": "Library: Slack",
-"ОбъектКомментарий": "CommentObject",
-"Текст комментария": "Comment text",
-"ОпубликоватьОбъект": "PublishObject",
-"ЗагрузитьМалыйФайл": "UploadSmallFile",
-"Создать твит гифки": "Create gif tweet",
-"ПараметрВКоллекцию": "ParameterToCollection",
-"Команда CLI: viber": "CLI Command: viber",
-"ЧЦ=10; ЧДЦ=0; ЧГ=0": "HC=10; HDC=0; HG=0",
-"Создать твит опрос": "Create poll tweet",
-"ПроцессорГенерации": "GenerationProcessor",
-"ЗагрузитьФайлПоURL": "UploadFileByURL",
-"ОтветИнициализации": "InitializationResponse",
-"РазмерПрефиксаGZip": "GZipPrefixSize",
-"МассивКлючЗначение": "KeyValueArray",
-"ИзменитьТемуФорума": "EditForumTopic",
-"ОсновнойОбработчик": "MainHandler",
-"Создать твит видео": "Create video tweet",
-"Опубликовать папку": "Publish folder",
-"Переместить объект": "Move object",
-"Телеграм_БанРазбан": "Telegram_BanUnban",
-"ПереданныйПараметр": "PassedParameter",
-"ДанныеПользователя": "UserData",
-"URL источник файла": "URL source of the file",
-"ОткрепитьСообщение": "UnpinMessage",
-"ДлительностьОпроса": "PollDuration",
-"ЗагрузитьМедиафайл": "UploadMediaFile",
-"VK_УдалитьКартинку": "VK_DeleteImage",
-"Тестовый заголовок": "TestTitle",
-"Открыть обсуждение": "Open discussion",
-"Имя        : title": "Name        : title",
-"СоздатьКомментарий": "CreateComment",
-"ДвоичныеВКоллекцию": "BinaryToCollection",
-"Архивировать канал": "Archive channel",
-"УправлениеДиалогом": "DialogManagement",
-"Наименование видео": "Video name",
-"ПолучитьПолеСсылки": "GetLinkField",
-"СоответствиеИконки": "Icon match",
-"ПолучитьПолеФлажка": "GetCheckboxField",
-"ПереименоватьКанал": "RenameChannel",
-"Создать обсуждение": "Create discussion",
-"Заголовок страницы": "Page title",
-"ИдентификаторФайла": "FileID",
-"РаботаСоСтраницами": "PageManagement",
-"Библиотека: Notion": "Library: Notion",
-"'Желтый','Зеленый'": "'Yellow','Green'",
-"Токен пользователя": "User token",
-"ПреобразоватьТекст": "ConvertText",
-"ГТ_ПолучитьТаблицу": "GT_GetTable",
-"ТекущаяВложенность": "CurrentNesting",
-"Работа с доступами": "Access management",
-"УдалитьВнешнийФайл": "DeleteExternalFile",
-"НачальнаяТабуляция": "InitialTab",
-"ФормированиеБлоков": "BlockFormation",
-"Активный   : green": "Active      : green",
-"Тестовая таблица 2": "TestTable2",
-"ПреобразоватьЧисло": "ConvertNumber",
-"Dropbox_УдалитьТег": "Dropbox_DeleteTag",
-"ПереместитьСобытие": "MoveEvent",
-"Написать сообщение": "Write a message",
-"Новое наименование": "New name",
-"ПреобразоватьСвязь": "ConvertLink",
+"Удалить сообщение": "Delete message",
+"Пост из автотеста": "Post from autotest",
+"ПолучитьПолеПочты": "GetEmailField",
+"Команда CLI: tools": "CLI Command: tools",
 "СтруктураВариантов": "VariantStructure",
+"ДлительностьОпроса": "PollDuration",
+"ПереместитьСобытие": "MoveEvent",
+"ДанныеПользователя": "UserData",
+"ЗагрузитьМалыйФайл": "UploadSmallFile",
+"СуществующаяГруппа": "ExistingGroup",
+"ПреобразоватьЧисло": "ConvertNumber",
+"ПолучитьТоварыПоИД": "GetProductsByID",
+"ПреобразоватьСвязь": "ConvertLink",
 "ПреобразоватьФайлы": "ConvertFiles",
 "ПреобразоватьПочту": "ConvertEmail",
-"ПолеИдентификатора": "IdentifierField",
-"СоответствиеТаблиц": "TableMapping",
-"СоответствиеФайлов": "FileMapping",
-"URL для сокращения": "URL for shortening",
-"Удаляет блок по ID": "Deletes block by ID",
-"РаботаССообщениями": "MessageManagement",
-"ПолучитьСтатистику": "GetStatistics",
 "УправлениеСобытием": "EventManagement",
-"ОтправитьСообщение": "SendMessage",
-"Закрыть обсуждение": "Close discussion",
-"Изменить сообщение": "Edit message",
-"Проверка_ВКИстория": "Check_VKStory",
-"ПолучитьБазуДанных": "GetDatabase",
+"СоответствиеФайлов": "FileMapping",
 "Команда CLI: slack": "CLI command: slack",
-"РежимОткрытияФайла": "FileOpenMode",
-"ДополнительныйЦвет": "SecondaryColor",
-"Изменить календарь": "Edit calendar",
-"Удаляет пост по id": "Deletes a post by ID",
-"СуществующаяГруппа": "ExistingGroup",
-"Идентификатор поля": "Field identifier",
-"Идентификатор базы": "Base identifier",
-"Анонимность опроса": "Poll anonymity",
-"Тестовый календарь": "TestCalendar",
-"ПолучитьТоварыПоИД": "GetProductsByID",
-"ЯДиск_СоздатьПапку": "YDisk_CreateFolder",
-"Получить календарь": "Get calendar",
-"СтандартнаяЕдиница": "StandardUnit",
-"УдалитьКомментарий": "DeleteComment",
-"ЗначенияПараметров": "ParameterValues",
-"ПолучитьИДКартинки": "GetImageID",
-"Отправить картинку": "Send image",
-"Тестовое сообщение": "TestMessage",
-"ID книги источника": "SourceBookID",
-"Отправить документ": "Send document",
+"'Желтый','Зеленый'": "'Yellow','Green'",
+"РаботаССообщениями": "MessageManagement",
+"ОтправитьСообщение": "SendMessage",
 "ДополнительныеФото": "AdditionalPhotos",
+"Проверка_ВКИстория": "Check_VKStory",
+"Изменить сообщение": "Edit message",
+"ПреобразоватьТекст": "ConvertText",
+"Телеграм_БанРазбан": "Telegram_BanUnban",
+"ДвоичныеВКоллекцию": "BinaryToCollection",
+"URL источник файла": "URL source of the file",
+"Заголовок страницы": "Page title",
+"РаботаСоСтраницами": "PageManagement",
+"Опубликовать папку": "Publish folder",
+"Библиотека: Notion": "Library: Notion",
+"Переместить объект": "Move object",
+"ПереданныйПараметр": "PassedParameter",
+"МассивКлючЗначение": "KeyValueArray",
+"ЧЦ=10; ЧДЦ=0; ЧГ=0": "HC=10; HDC=0; HG=0",
+"Наименование видео": "Video name",
+"Команда CLI: viber": "CLI Command: viber",
 "ID книги приемника": "DestinationBookID",
-"СкоприроватьОбъект": "CopyObject",
-"ЛимитПользователей": "UserLimit",
-"СтруктураПараметра": "ParameterStructure",
-"ПереслатьСообщение": "ForwardMessage",
-"ПолучитьПолеНомера": "GetNumberField",
-"Установить Webhook": "Set Webhook",
-"ПолучитьОбновления": "GetUpdates",
-"Команда CLI: tools": "CLI Command: tools",
-"ИнформацияОбОшибке": "ErrorInformation",
+"ID книги источника": "SourceBookID",
+"РазмерПрефиксаGZip": "GZipPrefixSize",
+"Удаляет пост по id": "Deletes a post by ID",
+"ЗначенияПараметров": "ParameterValues",
 "РазмерСжатыхДанных": "CompressedDataSize",
+"ДобавитьОбработчик": "AddHandler",
+"ОсновнойОбработчик": "MainHandler",
+"ИнформацияОбОшибке": "ErrorInformation",
+"СтандартнаяЕдиница": "StandardUnit",
 "СтрЗаканчиваетсяНа": "StrEndsWith",
+"Создать обсуждение": "Create discussion",
+"ЗагрузитьФайлПоURL": "UploadFileByURL",
+"ПолеИдентификатора": "IdentifierField",
+"Создать твит гифки": "Create gif tweet",
+"Удаляет блок по ID": "Deletes block by ID",
+"Создать твит видео": "Create video tweet",
+"ПолучитьСтатистику": "GetStatistics",
+"Создать твит опрос": "Create poll tweet",
+"Работа с доступами": "Access management",
+"URL для сокращения": "URL for shortening",
+"ПолучитьБазуДанных": "GetDatabase",
+"ЗагрузитьМедиафайл": "UploadMediaFile",
+"Написать сообщение": "Write a message",
+"Активный   : green": "Active      : green",
+"ОтветИнициализации": "InitializationResponse",
+"Имя        : title": "Name        : title",
+"Открыть обсуждение": "Open discussion",
+"СоответствиеИконки": "Icon match",
+"Закрыть обсуждение": "Close discussion",
+"РежимОткрытияФайла": "FileOpenMode",
+"НачальнаяТабуляция": "InitialTab",
+"Dropbox_УдалитьТег": "Dropbox_DeleteTag",
+"ТекущаяВложенность": "CurrentNesting",
+"ИзменитьТемуФорума": "EditForumTopic",
+"Получить календарь": "Get calendar",
+"Установить Webhook": "Set Webhook",
+"Тестовый заголовок": "TestTitle",
+"ПолучитьОбновления": "GetUpdates",
+"ПолучитьПолеНомера": "GetNumberField",
+"ПереименоватьКанал": "RenameChannel",
+"СтруктураПараметра": "ParameterStructure",
+"ГТ_ПолучитьТаблицу": "GT_GetTable",
+"ИдентификаторФайла": "FileID",
+"ПолучитьИДКартинки": "GetImageID",
+"Анонимность опроса": "Poll anonymity",
+"Идентификатор поля": "Field identifier",
+"Токен пользователя": "User token",
+"ОткрепитьСообщение": "UnpinMessage",
+"ЯДиск_СоздатьПапку": "YDisk_CreateFolder",
+"ОпубликоватьОбъект": "PublishObject",
+"ПереслатьСообщение": "ForwardMessage",
 "ЗакрепитьСообщение": "PinMessage",
-"Дата начала периода": "Start date of the period",
-"ИзменитьКомментарий": "EditComment",
-"Путь внутри объекта": "Path inside the object",
+"УдалитьКомментарий": "DeleteComment",
+"СкоприроватьОбъект": "CopyObject",
+"Тестовое сообщение": "TestMessage",
+"Новое наименование": "New name",
+"ДополнительныйЦвет": "SecondaryColor",
+"ФормированиеБлоков": "BlockFormation",
+"ЛимитПользователей": "UserLimit",
+"УдалитьВнешнийФайл": "DeleteExternalFile",
+"СоздатьКомментарий": "CreateComment",
+"ПолучитьПолеФлажка": "GetCheckboxField",
+"Идентификатор базы": "Base identifier",
+"Тестовый календарь": "TestCalendar",
+"ПроцессорГенерации": "GenerationProcessor",
+"Архивировать канал": "Archive channel",
+"Отправить картинку": "Send image",
+"СоответствиеТаблиц": "TableMapping",
+"ПараметрВКоллекцию": "ParameterToCollection",
+"Тестовая таблица 2": "TestTable2",
+"ПолучитьПолеСсылки": "GetLinkField",
+"Изменить календарь": "Edit calendar",
+"VK_УдалитьКартинку": "VK_DeleteImage",
+"Отправить документ": "Send document",
+"УправлениеДиалогом": "DialogManagement",
+"СтруктураПараметров": "ParametersStructure",
+"РаботаСОбсуждениями": "DiscussionManagement",
+"ПолучитьКомментарии": "GetComments",
+"Отправляемая ссылка": "SentLink",
+"АльтернативныйТекст": "AlternateText",
 "Опубликовать объект": "Publish object",
-"СписокПользователей": "UserList",
-"УправлениеПодборкой": "SelectionManagement",
-"Команда CLI: yandex": "CLI Command: yandex",
-"СгруппироватьТовары": "GroupProducts",
-"НаписатьКомментарий": "WriteComment",
-"Новое описание базы": "New database description",
-"ИсполняемыеСценарии": "ExecutableScripts",
-"Длительность опроса": "Poll duration",
-"Удалить комментарий": "Delete comment",
-"Получить статистику": "Get statistics",
-"Данные для API v1.1": "Data for API v1.1",
-"АккаунтИАвторизация": "AccountAndAuthorization",
-"Архив      : yellow": "Archive     : yellow",
-"Создать\/Удалить тег": "Create\/Delete tag",
-"ПолучитьОбщийМодуль": "GetCommonModule",
-"Команда CLI: google": "CLI command: google",
-"Команда CLI: gdrive": "CLI Command: gdrive",
-"ПолучитьТокенПоКоду": "GetTokenByCode",
 "Отбор по типу файла": "Filter by file type",
-"ПараметрыЗаписиJSON": "JSONWriteParameters",
-"Команда CLI: notion": "CLI command: notion",
-"ОбработатьВыводJSON": "ProcessJSONOutput",
-"СоздатьКопиюОбъекта": "CreateObjectCopy",
-"Получает файл по ID": "Gets file by ID",
+"ПутьЛоговБиблиотеки": "LibraryLogPath",
+"ЗаменитьСпецСимволы": "ReplaceSpecialCharacters",
 "СоответствиеОбложки": "Cover match",
-"Идентификатор книги": "BookIdentifier",
-"Идентификатор файла": "File identifier",
 "РаботаСБазамиДанных": "DatabaseManagement",
+"НаписатьВОбсуждение": "WriteInDiscussion",
 "Создать базу данных": "Create database",
+"Ставит лайк на пост": "Likes a post",
 "Создает базу данных": "Creates a database",
 "Структура Из Строка": "Structure Of String",
-"Создает новую книгу": "Creates a new book",
-"Альбом из автотеста": "AlbumFromAutoTest",
-"Количество : number": "Quantity    : number",
-"Библиотека: Dropbox": "Library: Dropbox",
-"Скоприровать объект": "Copy object",
+"СоздатьКопиюОбъекта": "CreateObjectCopy",
+"СтруктураКлавиатуры": "KeyboardStructure",
+"Создать комментарий": "Create comment",
+"Данные для API v1.1": "Data for API v1.1",
 "ПолучитьКомментарий": "GetComment",
-"ПреобразованиеТипов": "TypeConversion",
-"ЗаменитьСпецсимволы": "ReplaceSpecialCharacters",
-"ПреобразоватьСтатус": "ConvertStatus",
-"Структура из Строка": "Structure Of String",
-"ПолучитьКомментарии": "GetComments",
-"ПолучитьТекущуюДату": "GetCurrentDate",
-"ПолучитьДанныеФайла": "GetFileData",
-"Библиотека: Twitter": "Library: Twitter",
-"ПутьЛоговБиблиотеки": "LibraryLogPath",
-"Массив файлов видео": "Video files array",
-"Переслать сообщение": "Forward message",
-"ПолучитьВнешнийФайл": "GetExternalFile",
-"ДобавитьВнешнийФайл": "AddExternalFile",
-"ВК_МетодыОбсуждений": "VK_DiscussionMethods",
-"ПолучитьПараметрыВК": "GetVKParameters",
-"АльтернативныйТекст": "AlternateText",
-"Переименовать канал": "Rename channel",
-"Получить список баз": "Get list of bases",
-"СтруктураПараметров": "ParametersStructure",
-"СтруктураЗаголовков": "HeadersStructure",
-"СформироватьКоманду": "FormCommand",
-"ОбработатьДанныеTMA": "ProcessTMAData",
 "РаскодироватьСтроку": "DecodeString",
-"СоответствиеСобытия": "EventMatch",
-"РабочееПространство": "Workspace",
-"МассивПользователей": "ArrayOfUsers",
-"Закрыть тему форума": "Close forum thread",
-"ПолучитьТаблицыБазы": "GetDatabaseTables",
-"Удаляет тему форума": "Deletes a forum thread",
-"Удалить тему форума": "Delete forum thread",
-"Открыть тему форума": "Open forum thread",
-"Получить обновления": "Get updates",
-"СоответствиеСвойств": "PropertyMatch",
-"НеобходимыйПараметр": "RequiredParameter",
-"Отправить сообщение": "Send message",
-"Массив файлов гифок": "Gif files array",
+"ОбработатьВыводJSON": "ProcessJSONOutput",
+"ОбработатьДанныеTMA": "ProcessTMAData",
+"РазмерПостфиксаGZip": "GZipPostfixSize",
 "ПолучитьСписокТегов": "GetTagList",
-"Dropbox_ДобавитьТег": "Dropbox_AddTag",
-"СоздатьТвитКартинки": "Create image tweet",
-"Закрепить сообщение": "Pin message",
+"Измененная подборка": "EditedCollection",
+"Идентификатор книги": "BookIdentifier",
+"Создает новую книгу": "Creates a new book",
+"ЗаменитьСпецсимволы": "ReplaceSpecialCharacters",
+"СоответствиеСвойств": "PropertyMatch",
+"Получить обновления": "Get updates",
+"ИсполняемыеСценарии": "ExecutableScripts",
+"ПолучитьПараметрыВК": "GetVKParameters",
+"ВК_МетодыОбсуждений": "VK_DiscussionMethods",
+"БуферДвоичныхДанных": "BinaryDataBuffer",
+"Получает файл по ID": "Gets file by ID",
+"Команда CLI: google": "CLI command: google",
+"НеобходимыйПараметр": "RequiredParameter",
+"Идентификатор файла": "File identifier",
+"СформироватьКоманду": "FormCommand",
+"ПолучитьТокенПоКоду": "GetTokenByCode",
+"Переслать сообщение": "Forward message",
+"Команда CLI: notion": "CLI command: notion",
+"Команда CLI: yandex": "CLI Command: yandex",
+"Путь внутри объекта": "Path inside the object",
+"СтруктураЗаголовков": "HeadersStructure",
+"Скоприровать объект": "Copy object",
+"ПереданныеПараметры": "PassedParameters",
+"Команда CLI: gdrive": "CLI Command: gdrive",
+"Количество : number": "Quantity    : number",
+"Создать тему форума": "Create forum thread",
+"СоответствиеМетодов": "MethodCorrespondence",
+"АккаунтИАвторизация": "AccountAndAuthorization",
+"МассивПользователей": "ArrayOfUsers",
+"Библиотека: Twitter": "Library: Twitter",
+"Массив из Структура": "Array of Structure",
+"ПолучитьДанныеФайла": "GetFileData",
+"Массив Из Структура": "Array of Structures",
+"ПолучитьТекущуюДату": "GetCurrentDate",
+"Переместить событие": "Move event",
+"ПреобразованиеТипов": "TypeConversion",
+"Переименовать канал": "Rename channel",
+"ПараметрыЗаписиJSON": "JSONWriteParameters",
+"Закрыть тему форума": "Close forum thread",
+"ПреобразоватьСтатус": "ConvertStatus",
+"Архив      : yellow": "Archive     : yellow",
+"РабочееПространство": "Workspace",
+"ПолучитьТаблицыБазы": "GetDatabaseTables",
+"Отправить сообщение": "Send message",
 "ПреобразоватьБулево": "ConvertBoolean",
 "ПреобразоватьСсылку": "ConvertLink",
+"Открыть тему форума": "Open forum thread",
+"Удалить тему форума": "Delete forum thread",
+"Альбом из автотеста": "AlbumFromAutoTest",
+"Удаляет тему форума": "Deletes a forum thread",
+"УправлениеПодборкой": "SelectionManagement",
+"Структура из Строка": "Structure Of String",
+"СгруппироватьТовары": "GroupProducts",
+"Библиотека: Dropbox": "Library: Dropbox",
 "РаботаСТемамиФорума": "ForumTopicManagement",
-"Массив Из Структура": "Array of Structures",
-"Ставит лайк на пост": "Likes a post",
-"Dropbox_СкачатьФайл": "Dropbox_DownloadFile",
-"НаписатьВОбсуждение": "WriteInDiscussion",
-"Открепить сообщение": "Unpin message",
-"Переместить событие": "Move event",
-"ПереданныеПараметры": "PassedParameters",
-"ЗаменитьСпецСимволы": "ReplaceSpecialCharacters",
-"РаботаСОбсуждениями": "DiscussionManagement",
-"РазмерПостфиксаGZip": "GZipPostfixSize",
+"Получить список баз": "Get list of bases",
+"СоответствиеСобытия": "EventMatch",
+"Dropbox_ДобавитьТег": "Dropbox_AddTag",
 "Команда CLI: yadisk": "CLI command: yadisk",
-"Измененная подборка": "EditedCollection",
-"Массив из Структура": "Array of Structure",
-"Создать комментарий": "Create comment",
-"СоответствиеМетодов": "MethodCorrespondence",
-"Создать тему форума": "Create forum thread",
-"Отправляемая ссылка": "SentLink",
-"БуферДвоичныхДанных": "BinaryDataBuffer",
-"ПолучитьСвойАккаунт": "GetOwnAccount",
-"СтруктураКлавиатуры": "KeyboardStructure",
+"ИзменитьКомментарий": "EditComment",
+"ПолучитьВнешнийФайл": "GetExternalFile",
+"НаписатьКомментарий": "WriteComment",
+"Новое описание базы": "New database description",
+"СоздатьТвитКартинки": "Create image tweet",
 "Создает новый канал": "Creates a new channel",
+"ПолучитьОбщийМодуль": "GetCommonModule",
+"Закрепить сообщение": "Pin message",
+"Длительность опроса": "Poll duration",
+"Dropbox_СкачатьФайл": "Dropbox_DownloadFile",
+"Получить статистику": "Get statistics",
+"Удалить комментарий": "Delete comment",
+"Создать\/Удалить тег": "Create\/Delete tag",
+"Массив файлов видео": "Video files array",
 "Наименование канала": "Channel name",
-"Сгруппировать товары": "Group products",
-"МассивДвоичныхДанных": "BinaryDataArray",
-"СтруктураОтправителя": "SenderStructure",
-"РазмерНесжатыхДанных": "UncompressedDataSize",
-"СоздатьСоставнойПост": "CreateCompositePost",
-"КоличествоПараметров": "NumberOfParameters",
-"СледующаяВложенность": "NextNesting",
-"ЗагрузитьБольшойФайл": "UploadLargeFile",
-"Получить комментарии": "Get comments",
-"ВозвращаемоеЗначение": "ReturnValue",
-"Наименование альбома": "Album name",
-"Изменить комментарий": "Modify comment",
-"МассивСтруктурКнопок": "ArrayOfButtonStructures",
-"Аннотация к картинке": "Image annotation",
-"ПолучитьПодборкиПоИД": "GetSelectionsByID",
-"Делает репост записи": "Reposts the record",
-"Написать комментарий": "Write a comment",
-"Команда CLI: dropbox": "CLI Command: dropbox",
-"РаботаСКомментариями": "CommentManagement",
-"Тестовое сообщение 1": "TestMessage1",
-"Получить базу данных": "Get database",
-"Изменение публикации": "PublicationChange",
-"СоответствиеВарианта": "OptionMap",
-"ПодчиненнаяСтруктура": "SubordinateStructure",
-"Список пользователей": "User list",
-"ИнформацияОПрогрессе": "ProgressInformation",
+"Массив файлов гифок": "Gif files array",
+"Открепить сообщение": "Unpin message",
+"СписокПользователей": "UserList",
+"ПолучитьСвойАккаунт": "GetOwnAccount",
+"Дата начала периода": "Start date of the period",
+"ДобавитьВнешнийФайл": "AddExternalFile",
 "ПрограммныйИнтерфейс": "ProgrammingInterface",
-"ВернутьДочерниеБлоки": "ReturnChildBlocks",
-"Библиотека: Airtable": "Library: Airtable",
-"Проверка_ТелеграмБан": "Check_TelegramBan",
-"ОтправитьМедиагруппу": "SendMediaGroup",
-"ДобавитьОписаниеБазы": "AddDatabaseDescription",
-"Новый заголовок базы": "New database title",
-"ДобавитьСвойстваБазы": "AddDatabaseProperties",
-"Изменить тему форума": "Edit forum thread",
-"ДобавитьРодителяБазы": "AddDatabaseParent",
-"ВК_ЛайкРепостКоммент": "VK_LikeRepostComment",
-"Свойства базы данных": "Database properties",
-"VK_ОткрытьОбсуждение": "VK_OpenDiscussion",
-"VK_ЗакрытьОбсуждение": "VK_CloseDiscussion",
-"СоответствиеСимволов": "CharacterMapping",
-"ИзменитьСвойстваБазы": "EditDatabaseProperties",
+"МассивСтруктурКнопок": "ArrayOfButtonStructures",
 "VK_СоздатьОбсуждение": "VK_CreateDiscussion",
-"ПреобразоватьТелефон": "ConvertPhone",
-"Вайбер_ОтправитьФайл": "Viber_SendFile",
-"УстановитьЦельКанала": "SetChannelGoal",
-"УстановитьТемуКанала": "SetChannelTopic",
-"ПолучитьПолеТелефона": "GetPhoneField",
-"Пустой макет события": "Empty event template",
-"Тестовое сообщение 2": "TestMessage2",
-"СделатьФайлПубличным": "MakeFilePublic",
-"СделатьФайлПриватным": "MakeFilePrivate",
-"URL к внешнему файлу": "URL to external file",
-"ОтправитьВнешнийФайл": "SendExternalFile",
-"ПолучитьИмяФайлаТела": "GetBodyFileName",
-"Удалить внешний файл": "Delete external file",
-"Идентификатор канала": "Channel ID",
-"Библиотека: Telegram": "Library: Telegram",
-"Тестовый комментарий": "TestComment",
-"ПолучениеОбщихДанных": "GeneralDataRetrieval",
-"Обновленный файл.jpg": "UpdatedFile.jpg",
-"СоответствиеВозврата": "ReturnMapping",
-"УправлениеИНастройки": "ManagementAndSettings",
-"Dropbox_СоздатьПапку": "Dropbox_CreateFolder",
-"Dropbox_СкачатьПапку": "Dropbox_DownloadFolder",
-"ответ сервера Google": "Google server response",
-"Команда CLI: twitter": "CLI Command: twitter",
-"Проверка_НоушнОбъект": "Check_NotionObject",
-"ID страницы родителя": "Parent page ID",
-"Telegram_СкачатьФайл": "Telegram_DownloadFile",
-"ID копируемого листа": "CopiedSheetID",
-"СоздатьТекстовыйТвит": "CreateTextTweet",
+"ВозвращаемоеЗначение": "ReturnValue",
+"VK_ЗакрытьОбсуждение": "VK_CloseDiscussion",
+"VK_ОткрытьОбсуждение": "VK_OpenDiscussion",
+"СледующаяВложенность": "NextNesting",
 "ПолучитьСписокТестов": "GetTestList",
-"ВывестиДопИнформацию": "DisplayAdditionalInformation",
-"Команда CLI: gsheets": "CLI Command: gsheets",
-"УстановитьФайлВывода": "SetOutputFile",
-"УстановитьРежимТеста": "SetTestMode",
-"Создать\/Удалить блок": "Create\/Delete block",
-"Путь или ID каталога": "Path or ID of the directory",
-"ЗагрузитьФайлЧастями": "UploadFileInParts",
-"ЗаголовокАвторизации": "AuthorizationHeader",
-"Создать\/Удалить пост": "Create\/Delete post",
-"НастройкиИИнформация": "SettingsAndInformation",
-"Получить комментарий": "Get comment",
-"СоответствиеЗначений": "ValueMapping",
-"ПолучитьСписокФайлов": "GetFilesList",
+"Проверка_ТелеграмБан": "Check_TelegramBan",
+"СтруктураОтправителя": "SenderStructure",
 "СформироватьТестыЯкс": "FormYAXTests",
+"ПолучитьПодборкиПоИД": "GetSelectionsByID",
+"МассивДвоичныхДанных": "BinaryDataArray",
+"ВК_ЛайкРепостКоммент": "VK_LikeRepostComment",
+"Библиотека: Airtable": "Library: Airtable",
+"Тестовый комментарий": "TestComment",
+"Вайбер_ОтправитьФайл": "Viber_SendFile",
+"Проверка_НоушнОбъект": "Check_NotionObject",
+"Сгруппировать товары": "Group products",
+"Делает репост записи": "Reposts the record",
 "Описание нового поля": "Description of the new field",
-"ID родительской базы": "Parent database ID",
-"Соответствие свойств": "Properties match",
-"СоздатьСтраницуВБазу": "CreatePageInDatabase",
+"Dropbox_СоздатьПапку": "Dropbox_CreateFolder",
+"Изменить комментарий": "Modify comment",
+"Написать комментарий": "Write a comment",
+"КоличествоПараметров": "NumberOfParameters",
+"Создать\/Удалить блок": "Create\/Delete block",
+"Изменение публикации": "PublicationChange",
+"Обновленный файл.jpg": "UpdatedFile.jpg",
+"Создать\/Удалить пост": "Create\/Delete post",
+"Команда CLI: dropbox": "CLI Command: dropbox",
+"ПолучитьИмяФайлаТела": "GetBodyFileName",
+"РазмерНесжатыхДанных": "UncompressedDataSize",
+"Получить комментарии": "Get comments",
+"СоответствиеСимволов": "CharacterMapping",
 "ПолучитьПолеВложения": "GetAttachmentField",
-"Удаляет событие по ID": "Deletes an event by ID",
-"Проверка_ДропБоксФайл": "Check_DropboxFile",
-"В работе   : checkbox": "In progress : checkbox",
-"Создать\/Изменить базу": "Create\/Edit database",
-"СоздатьСвойствоТовара": "CreateProductProperty",
-"Новый текст сообщения": "New message text",
-"Идентификатор объекта": "Object identifier",
-"Создает новое событие": "Creates a new event",
-"Слак_ПолучитьСписокВФ": "Slack_GetExternalFileList",
-"ПолучитьСписокКаналов": "GetChannelList",
-"ПолучитьПолеСтроковое": "GetStringField",
-"УдалитьСвойствоТовара": "DeleteProductProperty",
-"ПолучитьСписокСобытий": "GetEventList",
-"Отправить медиагруппу": "Send media group",
-"ЗаписатьПараметрВФайл": "WriteParameterToFile",
+"Наименование альбома": "Album name",
+"ВывестиДопИнформацию": "DisplayAdditionalInformation",
+"Тестовое сообщение 1": "TestMessage1",
+"УстановитьФайлВывода": "SetOutputFile",
+"ПолучитьПолеТелефона": "GetPhoneField",
+"Путь или ID каталога": "Path or ID of the directory",
+"УстановитьРежимТеста": "SetTestMode",
+"СоздатьСоставнойПост": "CreateCompositePost",
+"Тестовое сообщение 2": "TestMessage2",
+"Telegram_СкачатьФайл": "Telegram_DownloadFile",
+"РаботаСКомментариями": "CommentManagement",
+"Dropbox_СкачатьПапку": "Dropbox_DownloadFolder",
+"ЗагрузитьБольшойФайл": "UploadLargeFile",
+"ИнформацияОПрогрессе": "ProgressInformation",
+"ОтправитьВнешнийФайл": "SendExternalFile",
+"ПолучениеОбщихДанных": "GeneralDataRetrieval",
+"УстановитьЦельКанала": "SetChannelGoal",
+"ЗагрузитьФайлЧастями": "UploadFileInParts",
+"УстановитьТемуКанала": "SetChannelTopic",
+"ДобавитьСвойстваБазы": "AddDatabaseProperties",
+"ВернутьДочерниеБлоки": "ReturnChildBlocks",
+"Команда CLI: gsheets": "CLI Command: gsheets",
+"Список пользователей": "User list",
+"ОтправитьМедиагруппу": "SendMediaGroup",
+"УправлениеИНастройки": "ManagementAndSettings",
+"СоответствиеВарианта": "OptionMap",
+"ответ сервера Google": "Google server response",
+"URL к внешнему файлу": "URL to external file",
+"Пустой макет события": "Empty event template",
+"НастройкиИИнформация": "SettingsAndInformation",
+"ДобавитьРодителяБазы": "AddDatabaseParent",
+"ПреобразоватьТелефон": "ConvertPhone",
+"Идентификатор канала": "Channel ID",
+"ЗаголовокАвторизации": "AuthorizationHeader",
+"Получить базу данных": "Get database",
+"СделатьФайлПубличным": "MakeFilePublic",
+"СоответствиеЗначений": "ValueMapping",
+"ID копируемого листа": "CopiedSheetID",
+"ПолучитьСписокФайлов": "GetFilesList",
+"Команда CLI: twitter": "CLI Command: twitter",
+"СоответствиеВозврата": "ReturnMapping",
+"Новый заголовок базы": "New database title",
+"ПодчиненнаяСтруктура": "SubordinateStructure",
+"Свойства базы данных": "Database properties",
+"ДобавитьОписаниеБазы": "AddDatabaseDescription",
+"ID страницы родителя": "Parent page ID",
+"ИзменитьСвойстваБазы": "EditDatabaseProperties",
+"Библиотека: Telegram": "Library: Telegram",
+"СделатьФайлПриватным": "MakeFilePrivate",
+"Получить комментарий": "Get comment",
+"СоздатьСтраницуВБазу": "CreatePageInDatabase",
+"Соответствие свойств": "Properties match",
+"Удалить внешний файл": "Delete external file",
+"Изменить тему форума": "Edit forum thread",
+"ID родительской базы": "Parent database ID",
+"СоздатьТекстовыйТвит": "CreateTextTweet",
+"Аннотация к картинке": "Image annotation",
+"ВыполнитьСборкуМусора": "PerformGarbageCollection",
 "ОтправлятьУведомления": "SendNotifications",
-"ПолучитьИсториюКанала": "GetChannelHistory",
-"ПреобразоватьВложения": "ConvertAttachments",
-"Проверка_ДропБоксТеги": "Check_DropboxTags",
+"Dropbox_УдалитьОбъект": "Dropbox_DeleteObject",
+"Создать копию объекта": "Create object copy",
+"МассивВариантовВыбора": "ChoiceOptionArray",
+"ID чата создания темы": "Thread creation chat ID",
+"ТекстПервогоСообщения": "Text of the first message",
+"Проверка_ВКОбсуждение": "Check_VKDiscussion",
+"Слак_ПолучитьСписокВФ": "Slack_GetExternalFileList",
+"Dropbox_ЗагрузитьФайл": "Dropbox_UploadFile",
 "Заголовок базы данных": "Database title",
-"ПолучитьСписокЗаказов": "GetOrderList",
-"ПолучитьОписаниеФайла": "GetFileDescription",
-"ДобавитьСерверныйТест": "AddServerTest",
-"Наименование кампании": "Campaign name",
-"Dropbox_ПолучитьТокен": "Dropbox_GetToken",
-"ПолучитьЗначенияЯчеек": "GetCellValues",
-"СклеитьДвоичныеДанные": "ConcatenateBinaryData",
+"ПреобразованныеДанные": "ConvertedData",
+"Библиотека: Yandex ID": "Library: Yandex ID",
+"УстановитьТелоЗапроса": "SetRequestBody",
+"УправлениеТемойФорума": "ForumTopicManagement",
+"Проверка_ДропБоксФайл": "Check_DropboxFile",
 "СоответствиеКатегорий": "CategoryCorrespondence",
+"ПолучитьСписокСобытий": "GetEventList",
+"ЗаписатьПараметрВФайл": "WriteParameterToFile",
+"ДобавитьЗаголовокБазы": "AddDatabaseHeader",
+"Команда CLI: airtable": "CLI Command: airtable",
+"Новый текст сообщения": "New message text",
+"Создать\/Изменить поле": "Create\/Edit field",
+"ВыполнитьЗапросСТелом": "ExecuteRequestWithBody",
+"ПолучитьСписокКаналов": "GetChannelList",
 "Ссылка получения кода": "Code retrieval link",
 "ПолучитьСписокТоваров": "GetProductList",
-"Проверка_ВКОбсуждение": "Check_VKDiscussion",
-"ДвоичныеДанные,Строка": "BinaryData,String",
-"Получить товары по ID": "Get products by ID",
-"Идентификатор таблицы": "Table identifier",
-"Новое название канала": "New channel name",
-"ДобавитьТестовыйНабор": "AddTestSet",
-"ПреобразованныеДанные": "ConvertedData",
-"Создать\/Изменить поле": "Create\/Edit field",
-"МассивВариантовВыбора": "ChoiceOptionArray",
-"Удаляет лист из книги": "Deletes a sheet from the book",
-"ПолучитьТаблицуТестов": "GetTestTable",
-"Массив описаний полей": "Array of field descriptions",
-"ID рекламной кампании": "Advertising campaign ID",
-"ЗаполнитьМассивЛистов": "FillSheetArray",
-"Dropbox_УдалитьОбъект": "Dropbox_DeleteObject",
-"ИнтерактивныеДействия": "InteractiveActions",
-"Dropbox_ЗагрузитьФайл": "Dropbox_UploadFile",
-"Путь сохранения файла": "File save path",
-"Написать в обсуждение": "Write in discussion",
-"ПолучитьСписокСвойств": "GetPropertyList",
-"Dropbox_ОбновитьТокен": "Dropbox_UpdateToken",
-"ДобавитьЗаголовокБазы": "AddDatabaseHeader",
-"Библиотека: Yandex ID": "Library: Yandex ID",
-"ТекстПервогоСообщения": "Text of the first message",
-"ПолучитьСписокЗаписей": "GetListOfRecords",
-"ВыполнитьЗапросСТелом": "ExecuteRequestWithBody",
-"Получить таблицы базы": "Get base tables",
-"Географическая широта": "Geographic latitude",
-"ВыполнитьСборкуМусора": "PerformGarbageCollection",
-"Команда CLI: airtable": "CLI Command: airtable",
-"Заголовок приглашения": "Invitation title",
-"ID целевого сообщения": "Target message ID",
-"ВК_ОтправитьСообщение": "VK_SendMessage",
-"ID чата создания темы": "Thread creation chat ID",
-"УправлениеТемойФорума": "ForumTopicManagement",
-"СтруктураПользователя": "UserStructure",
-"ВК_ПолучитьСтатистику": "VK_GetStatistics",
 "Загрузить файл по URL": "Upload file by URL",
-"ВК_СоздатьУдалитьПост": "VK_CreateDeletePost",
-"УстановитьТелоЗапроса": "SetRequestBody",
-"МассивВариантовОпроса": "PollOptionsArray",
-"Создать твит картинки": "Create image tweet",
-"Получить список тегов": "Get list of tags",
+"Создает новое событие": "Creates a new event",
+"Заголовок приглашения": "Invitation title",
+"Проверка_ДропБоксТеги": "Check_DropboxTags",
+"Географическая широта": "Geographic latitude",
+"Dropbox_ОбновитьТокен": "Dropbox_UpdateToken",
+"Dropbox_ПолучитьТокен": "Dropbox_GetToken",
 "ЗагрузитьМедиаЧастями": "UploadMediaInParts",
-"Создать копию объекта": "Create object copy",
-"ЗаписатьФайлыРелэйтед": "WriteRelatedFiles",
-"двоичные данные файла": "binary data of the file",
-"ДобавитьContentLength": "AddContentLength",
-"СоответствиеЗаголовка": "HeaderMapping",
-"ID пользователя Viber": "Viber User ID",
-"Команда CLI: telegram": "CLI command: telegram",
-"ЗагрузитьФотоНаСервер": "UploadPhotoToServer",
-"ID асинхронной работы": "AsynchronousJobID",
-"Удаляет файл на Slack": "Deletes a file on Slack",
-"Твиттер_ОбновитьТокен": "Twitter_UpdateToken",
-"Проверка_ТвиттерТекст": "Check_TwitterText",
-"Ноушн_СоздатьСтраницу": "Notion_CreatePage",
-"Добавить внешний файл": "Add external file",
+"ID целевого сообщения": "Target message ID",
+"ID рекламной кампании": "Advertising campaign ID",
 "Получить данные файла": "Get file data",
-"Получить внешний файл": "Get external file",
+"МассивВариантовОпроса": "PollOptionsArray",
+"ID асинхронной работы": "AsynchronousJobID",
+"В работе   : checkbox": "In progress : checkbox",
+"Получить товары по ID": "Get products by ID",
+"Создать твит картинки": "Create image tweet",
+"ПолучитьЗначенияЯчеек": "GetCellValues",
+"ИнтерактивныеДействия": "InteractiveActions",
 "ЗаписатьЗначениеВФайл": "WriteValueToFile",
+"Удаляет файл на Slack": "Deletes a file on Slack",
+"Написать в обсуждение": "Write in discussion",
+"Создать\/Изменить базу": "Create\/Edit database",
+"Наименование кампании": "Campaign name",
+"СоздатьСвойствоТовара": "CreateProductProperty",
+"Путь сохранения файла": "File save path",
+"Получить список тегов": "Get list of tags",
+"Удаляет лист из книги": "Deletes a sheet from the book",
+"Получить внешний файл": "Get external file",
+"Удаляет событие по ID": "Deletes an event by ID",
+"ЗаполнитьМассивЛистов": "FillSheetArray",
 "Строка,ДвоичныеДанные": "String, BinaryData",
-"РаботаСФайламиИПапками": "FileAndFolderManagement",
-"Получить токен по коду": "Get token by code",
-"ВК_СоздатьСсылкуТокена": "VK_CreateTokenLink",
-"ЗаполнитьДанныеПоСхеме": "FillDataBySchema",
-"ID изменяемой страницы": "ID of the page being modified",
-"ЗагрузитьВидеоНаСервер": "UploadVideoToServer",
-"Дневной лимит в рублях": "Daily limit in rubles",
-"Массив описаний блоков": "Array of block descriptions",
-"Соответствие Из Строка": "Compliance From String",
-"VK_НаписатьВОбсуждение": "VK_PostToDiscussion",
-"ПолучитьСписокПодборок": "GetSelectionList",
-"Сообщение из автотеста": "Message from autotest",
-"Новое имя главной темы": "New main thread name",
-"ДобавитьОписаниеДанных": "AddDataDescription",
-"Сделать файл публичным": "Make file public",
+"Проверка_ТвиттерТекст": "Check_TwitterText",
+"ЗагрузитьФотоНаСервер": "UploadPhotoToServer",
+"Отправить медиагруппу": "Send media group",
+"УдалитьСвойствоТовара": "DeleteProductProperty",
+"ДвоичныеДанные,Строка": "BinaryData,String",
+"Получить таблицы базы": "Get base tables",
+"Идентификатор объекта": "Object identifier",
+"двоичные данные файла": "binary data of the file",
+"ПолучитьСписокЗаписей": "GetListOfRecords",
+"ВК_ОтправитьСообщение": "VK_SendMessage",
+"ДобавитьТестовыйНабор": "AddTestSet",
+"ID пользователя Viber": "Viber User ID",
+"Идентификатор таблицы": "Table identifier",
+"Добавить внешний файл": "Add external file",
+"ВК_ПолучитьСтатистику": "VK_GetStatistics",
+"ПолучитьТаблицуТестов": "GetTestTable",
+"СклеитьДвоичныеДанные": "ConcatenateBinaryData",
+"ПолучитьОписаниеФайла": "GetFileDescription",
+"Массив описаний полей": "Array of field descriptions",
+"ПолучитьСписокЗаказов": "GetOrderList",
+"ВК_СоздатьУдалитьПост": "VK_CreateDeletePost",
+"ЗаписатьФайлыРелэйтед": "WriteRelatedFiles",
+"ДобавитьContentLength": "AddContentLength",
+"Команда CLI: telegram": "CLI command: telegram",
+"ПолучитьИсториюКанала": "GetChannelHistory",
+"ДобавитьСерверныйТест": "AddServerTest",
+"Новое название канала": "New channel name",
+"Ноушн_СоздатьСтраницу": "Notion_CreatePage",
+"ПолучитьПолеСтроковое": "GetStringField",
+"ПолучитьСписокСвойств": "GetPropertyList",
+"ПреобразоватьВложения": "ConvertAttachments",
+"СоответствиеЗаголовка": "HeaderMapping",
+"Твиттер_ОбновитьТокен": "Twitter_UpdateToken",
+"СтруктураПользователя": "UserStructure",
+"СоответствиеПараметров": "ParameterMap",
 "ID рекламного кабинета": "Advertising account ID",
-"Сделать файл приватным": "Make file private",
-"УстановитьТелоИзСтроки": "SetBodyFromString",
+"ДобавитьТоварВПодборку": "AddProductToSelection",
+"Получить пользователей": "Get users",
 "и почитать комментарии": "and read comments",
-"Получить список файлов": "Get list of files",
-"Создать\/Удалить записи": "Create\/Delete records",
-"Изменить свойства базы": "Edit database properties",
+"РаботаСФайламиИПапками": "FileAndFolderManagement",
+"Массив файлов картинок": "Image files array",
+"УдалитьЛишниеПоляБлока": "RemoveExtraBlockFields",
+"ПолучитьОписаниеТовара": "GetProductDescription",
+"Проверка_ТелеграмВидео": "Check_TelegramVideo",
+"Соответствие из Строка": "Map from String",
+"ПреобразоватьЗаголовок": "ConvertHeader",
+"Соответствие Из Строка": "Compliance From String",
+"Команда CLI: gcalendar": "CLI Command: gcalendar",
+"ИзменитьСвойствоТовара": "EditProductProperty",
+"Удаляет подборку по ID": "Deletes the selection by ID",
+"КаталогЛоговБиблиотеки": "LibraryLogCatalog",
+"Проверка_ТелеграмЧисло": "Check_TelegramNumber",
+"ПолучитьДвоичныеДанные": "GetBinaryData",
+"Проверка_ТелеграмОпрос": "Check_TelegramPoll",
+"ID изменяемой страницы": "ID of the page being modified",
+"Проверка_ТелеграмГифка": "Check_TelegramGif",
+"ЗаполнитьДанныеПоСхеме": "FillDataBySchema",
+"Проверка_ТелеграмАудио": "Check_TelegramAudio",
+"Дневной лимит в рублях": "Daily limit in rubles",
+"Массив из Произвольный": "Array of Arbitrary",
+"ПолучитьИнформациюБота": "GetBotInformation",
+"УдалитьТоварИзПодборки": "RemoveProductFromSelection",
+"Открыть\/Закрыть диалог": "Open\/Close dialog",
+"Сделать файл публичным": "Make file public",
+"Создать текстовый твит": "Create text tweet",
+"Новое имя главной темы": "New main thread name",
+"Вайбер_ОтправитьСсылку": "Viber_SendLink",
 "ПреобразоватьКодВТокен": "ConvertCodeToToken",
 "Загрузить\/Удалить Файл": "Upload\/Delete file",
-"Загрузить\/Удалить файл": "Upload\/Delete file",
-"ПолучитьОписаниеТовара": "GetProductDescription",
-"Установить цель канала": "Set channel purpose",
-"ЗаписатьДвоичныеДанные": "WriteBinaryData",
-"Возвращаемое значение:": "Return value:",
-"СформированноеОписание": "FormedDescription",
-"СформироватьКлавиатуру": "FormKeyboard",
+"Создать\/Удалить записи": "Create\/Delete records",
 "УстановитьРежимОтладки": "SetDebugMode",
-"Получает список файлов": "Gets the list of files",
-"Установить тему канала": "Set channel topic",
-"ЗаписатьJSONМультипарт": "WriteJSONMultipart",
-"УстановитьИмяФайлаТела": "SetBodyFileName",
-"Создает твит с опросом": "Creates a tweet with a poll",
-"СтандартныеЗависимости": "StandardDependencies",
-"Получить пользователей": "Get users",
-"Массив файлов картинок": "Image files array",
-"Открыть\/Закрыть диалог": "Open\/Close dialog",
-"Создать текстовый твит": "Create text tweet",
-"Путь к папке или файлу": "Path to folder or file",
-"Загружает файл на диск": "Uploads a file to the drive",
-"ПроверитьЗагрузкуЧасти": "CheckPartUpload",
-"Получает событие по ID": "Gets an event by ID",
-"Описание   : rich_text": "Description : rich_text",
-"Массив из Произвольный": "Array of Arbitrary",
-"ДропБокс_ЗагрузитьФайл": "Dropbox_UploadFile",
-"ВыполнитьЗапросБезТела": "ExecuteRequestWithoutBody",
-"ПолучитьМассивПодборок": "GetSelectionArray",
-"Географическая долгота": "Geographic longitude",
-"ПреобразоватьЗаголовок": "ConvertHeader",
-"СоответствиеПараметров": "ParameterMap",
-"НаименованиеИзмененное": "EditedName",
-"Dropbox_ПолучитьПревью": "Dropbox_GetPreview",
-"Соответствие из Строка": "Map from String",
-"Создать составной пост": "Create composite post",
-"Отправить внешний файл": "Send external file",
-"Вайбер_ОтправитьСсылку": "Viber_SendLink",
-"Проверка_ТелеграмЧисло": "Check_TelegramNumber",
-"ID календаря источника": "ID of the source calendar",
-"Команда CLI: gcalendar": "CLI Command: gcalendar",
-"ДобавитьТоварВПодборку": "AddProductToSelection",
-"Строка, ДвоичныеДанные": "String, BinaryData",
-"УдалитьТоварИзПодборки": "RemoveProductFromSelection",
-"Удаляет подборку по ID": "Deletes the selection by ID",
-"Проверка_ТелеграмВидео": "Check_TelegramVideo",
-"ID календаря приемника": "ID of the target calendar",
-"Проверка_ТелеграмАудио": "Check_TelegramAudio",
-"КаталогЛоговБиблиотеки": "LibraryLogCatalog",
-"ИзменитьСвойствоТовара": "EditProductProperty",
-"ПолучитьИнформациюБота": "GetBotInformation",
-"Массив из Строка,Число": "Array of String,Number",
-"ПолучитьДвоичныеДанные": "GetBinaryData",
-"Вернуть дочерние блоки": "Return child blocks",
-"Проверка_ТелеграмОпрос": "Check_TelegramPoll",
-"Дата окончания периода": "End date of the period",
-"УдалитьЛишниеПоляБлока": "RemoveExtraBlockFields",
-"Новое описание события": "New event description",
 "СоздатьПодборкуТоваров": "CreateProductCollection",
-"Проверка_ТелеграмГифка": "Check_TelegramGif",
-"Telegram_УдалитьWebhook": "Telegram_DeleteWebhook",
-"АТ_СоздатьУдалитьЗаписи": "AT_CreateDeleteRecords",
-"Создать\/Удалить событие": "Create\/Delete event",
-"Действия с обсуждениями": "Actions with discussions",
-"Вайбер_ОтправитьКонтакт": "Viber_SendContact",
-"ОбеспечитьПустойКаталог": "EnsureEmptyDirectory",
-"СоединитьДвоичныеДанные": "JoinBinaryData",
-"Вайбер_ОтправитьЛокацию": "Viber_SendLocation",
-"Создать свойство товара": "Create product property",
-"Лайк\/Репост\/Комментарий": "Like\/Repost\/Comment",
-"ПолучитьРазделительПути": "GetPathSeparator",
-"ЗаписатьФайлыМультипарт": "WriteMultipartFiles",
-"Твиттер_СоздатьТвитСГиф": "Twitter_CreateTweetWithGif",
-"ГД_ЗагрузитьУдалитьФайл": "GD_UploadDeleteFile",
-"ГенераторОтчетаПокрытия": "CoverageReportGenerator",
-"ДропБокс_СоздатьКаталог": "Dropbox_CreateFolder",
-"Скопированный файл.jpeg": "CopiedFile.jpeg",
-"ПолучитьПубличныйОбъект": "GetPublicObject",
-"Получить список свойств": "Get property list",
-"Получить список заказов": "Get order list",
-"Путь к созаваемой папке": "Path to the created folder",
-"Телеграм_ОтправитьВидео": "Telegram_SendVideo",
-"Проверка_ДропБоксСтатус": "Check_DropboxStatus",
-"Проверка_ТелеграмИстина": "Check_TelegramTrue",
-"VK_СоздатьСоставнойПост": "VK_CreateCompositePost",
-"Проверка_ТелеграмМассив": "Check_TelegramArray",
-"Непредвиденная ошибка!:": "Unexpected Error!",
-"Проверка_ДропБоксРабота": "Check_DropboxWork",
-"ВК_СоздатьСоставнойПост": "VK_CreateCompositePost",
-"Слак_ЗагрузитьУдалитьВФ": "Slack_UploadDeleteExternalFile",
-"Получить подборки по ID": "Get selections by ID",
-"Удалить свойство товара": "Delete product property",
-"ПолучитьЗначениеИзФайла": "GetValueFromFile",
-"Сформировать клавиатуру": "Create keyboard",
-"ТаблицаДляИспользования": "TableForUse",
-"ВК_СоздатьТоварПодборку": "VK_CreateProductSelection",
-"Проверка_ДропБоксМассив": "Check_DropboxArray",
-"Новое название подборки": "New selection name",
-"Telegram_ОтправитьОпрос": "Telegram_SendPoll",
-"Телеграм_ОтправитьОпрос": "Telegram_SendPoll",
-"Telegram_ОтправитьВидео": "Telegram_SendVideo",
+"Сделать файл приватным": "Make file private",
+"ПолучитьМассивПодборок": "GetSelectionArray",
+"Загрузить\/Удалить файл": "Upload\/Delete file",
+"УстановитьТелоИзСтроки": "SetBodyFromString",
+"ID календаря источника": "ID of the source calendar",
+"ЗаписатьДвоичныеДанные": "WriteBinaryData",
+"Получает список файлов": "Gets the list of files",
+"Получить список файлов": "Get list of files",
+"ВК_СоздатьСсылкуТокена": "VK_CreateTokenLink",
+"СтандартныеЗависимости": "StandardDependencies",
+"ЗаписатьJSONМультипарт": "WriteJSONMultipart",
+"СформироватьКлавиатуру": "FormKeyboard",
+"ПолучитьСписокПодборок": "GetSelectionList",
+"Строка, ДвоичныеДанные": "String, BinaryData",
+"ЗагрузитьВидеоНаСервер": "UploadVideoToServer",
+"УстановитьИмяФайлаТела": "SetBodyFileName",
+"Возвращаемое значение:": "Return value:",
+"Массив из Строка,Число": "Array of String,Number",
+"VK_НаписатьВОбсуждение": "VK_PostToDiscussion",
+"Загружает файл на диск": "Uploads a file to the drive",
+"Описание   : rich_text": "Description : rich_text",
+"ВыполнитьЗапросБезТела": "ExecuteRequestWithoutBody",
+"Отправить внешний файл": "Send external file",
+"СформированноеОписание": "FormedDescription",
+"Дата окончания периода": "End date of the period",
+"Создает твит с опросом": "Creates a tweet with a poll",
+"Массив описаний блоков": "Array of block descriptions",
+"Изменить свойства базы": "Edit database properties",
+"Вернуть дочерние блоки": "Return child blocks",
+"Dropbox_ПолучитьПревью": "Dropbox_GetPreview",
+"Получить токен по коду": "Get token by code",
+"ПроверитьЗагрузкуЧасти": "CheckPartUpload",
+"Установить цель канала": "Set channel purpose",
+"Географическая долгота": "Geographic longitude",
+"Сообщение из автотеста": "Message from autotest",
+"Создать составной пост": "Create composite post",
+"НаименованиеИзмененное": "EditedName",
+"ДропБокс_ЗагрузитьФайл": "Dropbox_UploadFile",
+"Новое описание события": "New event description",
+"Путь к папке или файлу": "Path to folder or file",
+"ДобавитьОписаниеДанных": "AddDataDescription",
+"ID календаря приемника": "ID of the target calendar",
+"Установить тему канала": "Set channel topic",
+"Получает событие по ID": "Gets an event by ID",
+"Пустое описание товара:": "Empty product description:",
 "Получить\/Обновить токен": "Get\/Update token",
-"Проверка_ДвоичныеДанные": "Check_BinaryData",
-"Новое значение свойства": "New property value",
-"Телеграм_ОтправитьАудио": "Telegram_SendAudio",
+"ДФ=yyyy-MM-ddThh:mm:ssZ": "ISO8601Datetime",
+"Какой ваш любимый цвет?": "What's your favorite color?",
+"Создать свойство товара": "Create product property",
+"Получить список свойств": "Get property list",
+"Удалить свойство товара": "Delete product property",
+"СкрытьГлавнуюТемуФорума": "HideMainForumTopic",
+"Непредвиденная ошибка!:": "Unexpected Error!",
 "Массив из Строка, Число": "Array of string, number",
+"МаксимальнаяВложенность": "MaximumNesting",
+"ГД_ЗагрузитьУдалитьФайл": "GD_UploadDeleteFile",
 "ИзменитьПодборкуТоваров": "EditProductCollection",
 "Новая картинка подборки": "New selection image",
-"ВывестиСправкуПоМетодам": "DisplayMethodHelp",
-"Telegram_ОтправитьАудио": "Telegram_SendAudio",
-"ЯДиск_ПереместитьОбъект": "YDisk_MoveObject",
-"Какой ваш любимый цвет?": "What's your favorite color?",
-"Телеграм_ОтправитьГифку": "Telegram_SendGIF",
-"Библиотека: Yandex Disk": "Library: Yandex Disk",
-"Telegram_ОтправитьГифку": "Telegram_SendGif",
-"МаксимальнаяВложенность": "MaximumNesting",
-"Создать\/Удалить каталог": "Create\/Delete catalog",
-"Новый текст комментария": "New comment text",
-"OPI_ПреобразованиеТипов": "OPI_TypeConversion",
-"УстановитьЗначенияЯчеек": "SetCellValues",
-"Получить список записей": "Get list of records",
-"ОтменитьПубликациюПапки": "CancelFolderPublication",
-"МассивURLФайловВложений": "ArrayOfAttachmentURLs",
-"ИсключатьАрхивированные": "ExcludeArchived",
+"Новое название подборки": "New selection name",
+"Новое значение свойства": "New property value",
+"Получить список заказов": "Get order list",
+"Сформировать клавиатуру": "Create keyboard",
+"Получить подборки по ID": "Get selections by ID",
+"Действия с обсуждениями": "Actions with discussions",
+"Лайк\/Репост\/Комментарий": "Like\/Repost\/Comment",
 "ОпределитьМетодОтправки": "DetermineSendMethod",
-"СкрытьГлавнуюТемуФорума": "HideMainForumTopic",
-"Создать канал приватным": "Create channel as private",
-"Получить список событий": "Get list of events",
-"ПолучитьСписокКаталогов": "GetDirectoriesList",
-"Получить историю канала": "Get channel history",
-"Массив ID пользователей": "User ID Array",
-"ПолучитьЧислоУчастников": "GetParticipantCount",
-"Не найден входной файл!": "Input File Not Found!",
-"Имя файла с расширением": "File name with extension",
-"Массив вариантов ответа": "Array of answer options",
-"УправлениеВнешнимФайлом": "ExternalFileManagement",
-"ПолучитьКалендарьСписка": "GetListCalendar",
-"УникальныйИдентификатор": "UniqueIdentifier",
-"ОтправитьМестоположение": "SendLocation",
-"Наименование новой базы": "New base name",
-"ДФ=yyyy-MM-ddTHH:mm:ssZ": "DF=yyyy-MM-ddTHH:mm:ssZ",
 "ПараметрыЗапросаВСтроку": "RequestParametersToString",
-"ID файла для скачивания": "File ID for downloading",
 "ОтменитьПубликациюФайла": "CancelFilePublication",
-"СформироватьМассивМедиа": "FormMediaArray",
-"Идентификатор базы База": "Base identifier Base",
-"СпособКодированияСтроки": "StringEncodingMethod",
-"Наименование обсуждения": "Discussion name",
+"Создать\/Удалить событие": "Create\/Delete event",
+"ПолучитьЧислоУчастников": "GetParticipantCount",
+"Создать\/Удалить каталог": "Create\/Delete catalog",
+"Не найден входной файл!": "Input File Not Found!",
 "ПолучитьИнформациюОБоте": "GetBotInformation",
-"СоздатьПроизвольныйТвит": "CreateCustomTweet",
-"Получить список каналов": "Get channel list",
-"Получить список товаров": "Get product list",
-"Получить значения ячеек": "Get cell values",
-"Путь к объекту удаления": "Path to the object to delete",
-"Удаляет календарь по ID": "Deletes a calendar by ID",
-"Пустое описание товара:": "Empty product description:",
-"ИзменитьКалендарьСписка": "EditListCalendar",
-"СоздатьЗаголовкиЗапроса": "CreateRequestHeaders",
-"ПолучитьОписаниеСобытия": "GetEventDescription",
-"Создать страницу в базу": "Create page in database",
-"ПолучитьСтатусОбработки": "GetProcessingStatus",
-"РазделитьДвоичныеДанные": "SplitBinaryData",
-"Произвольный, HTTPОтвет": "Arbitrary, HTTP Response",
-"Массив вариантов опроса": "Poll options array",
+"Новый текст комментария": "New comment text",
+"Библиотека: Yandex Disk": "Library: Yandex Disk",
+"Путь к созаваемой папке": "Path to the created folder",
+"Вайбер_ОтправитьКонтакт": "Viber_SendContact",
+"ПолучитьПубличныйОбъект": "GetPublicObject",
+"ПолучитьЗначениеИзФайла": "GetValueFromFile",
+"Получить историю канала": "Get channel history",
+"ЗаписатьФайлыМультипарт": "WriteMultipartFiles",
+"ЯДиск_ПереместитьОбъект": "YDisk_MoveObject",
+"Telegram_ОтправитьГифку": "Telegram_SendGif",
+"ПолучитьСписокКаталогов": "GetDirectoriesList",
+"Телеграм_ОтправитьГифку": "Telegram_SendGIF",
+"Telegram_ОтправитьАудио": "Telegram_SendAudio",
+"Телеграм_ОтправитьАудио": "Telegram_SendAudio",
+"Telegram_ОтправитьВидео": "Telegram_SendVideo",
+"Телеграм_ОтправитьВидео": "Telegram_SendVideo",
+"Слак_ЗагрузитьУдалитьВФ": "Slack_UploadDeleteExternalFile",
+"Наименование обсуждения": "Discussion name",
 "Текст первого сообщения": "Text of the first message",
-"ДФ=yyyy-MM-ddThh:mm:ssZ": "ISO8601Datetime",
+"Telegram_УдалитьWebhook": "Telegram_DeleteWebhook",
+"УстановитьЗначенияЯчеек": "SetCellValues",
+"ВывестиСправкуПоМетодам": "DisplayMethodHelp",
+"ДФ=yyyy-MM-ddTHH:mm:ssZ": "DF=yyyy-MM-ddTHH:mm:ssZ",
+"Создать канал приватным": "Create channel as private",
+"АТ_СоздатьУдалитьЗаписи": "AT_CreateDeleteRecords",
+"Телеграм_ОтправитьОпрос": "Telegram_SendPoll",
+"Telegram_ОтправитьОпрос": "Telegram_SendPoll",
+"Идентификатор базы База": "Base identifier Base",
+"Массив ID пользователей": "User ID Array",
+"ПолучитьОписаниеСобытия": "GetEventDescription",
+"ID файла для скачивания": "File ID for downloading",
+"Произвольный, HTTPОтвет": "Arbitrary, HTTP Response",
+"ВК_СоздатьТоварПодборку": "VK_CreateProductSelection",
+"СоединитьДвоичныеДанные": "JoinBinaryData",
+"Твиттер_СоздатьТвитСГиф": "Twitter_CreateTweetWithGif",
+"Наименование новой базы": "New base name",
 "для дальнейших действий": "for further actions",
+"СпособКодированияСтроки": "StringEncodingMethod",
+"ТаблицаДляИспользования": "TableForUse",
+"ПолучитьКалендарьСписка": "GetListCalendar",
+"Скопированный файл.jpeg": "CopiedFile.jpeg",
+"Получить список записей": "Get list of records",
+"МассивURLФайловВложений": "ArrayOfAttachmentURLs",
+"УправлениеВнешнимФайлом": "ExternalFileManagement",
+"OPI_ПреобразованиеТипов": "OPI_TypeConversion",
+"VK_СоздатьСоставнойПост": "VK_CreateCompositePost",
+"ВК_СоздатьСоставнойПост": "VK_CreateCompositePost",
+"Удаляет календарь по ID": "Deletes a calendar by ID",
+"Имя файла с расширением": "File name with extension",
+"ПолучитьРазделительПути": "GetPathSeparator",
+"Получить значения ячеек": "Get cell values",
+"Получить список событий": "Get list of events",
+"Проверка_ДвоичныеДанные": "Check_BinaryData",
+"Проверка_ТелеграмИстина": "Check_TelegramTrue",
+"Проверка_ДропБоксМассив": "Check_DropboxArray",
+"Создать страницу в базу": "Create page in database",
+"Получить список товаров": "Get product list",
+"ИсключатьАрхивированные": "ExcludeArchived",
+"Проверка_ДропБоксРабота": "Check_DropboxWork",
+"Проверка_ДропБоксСтатус": "Check_DropboxStatus",
 "ЗагрузитьМассивВложений": "Upload attachments array",
-"Создает каталог на диске": "Creates a directory on the disk",
-"ВК_ПолучитьСписокСвойств": "VK_GetPropertyList",
-"ВК_ПолучитьСписокЗаказов": "VK_GetOrderList",
-"Загрузить фото на сервер": "Upload photo to server",
-"Файл источник обновления": "File source for update",
-"РазложитьОбъектыПодробно": "BreakDownObjectsInDetail",
-"ДобавитьКалендарьВСписок": "AddCalendarToList",
-"Путь к целевому каталогу": "Path to the target directory",
-"Ссылка (URL) под записью": "Link (URL) under the post",
-"Получить данные аккаунта": "Get account data",
-"ПолучитьДвоичныеИлиПоток": "GetBinaryOrStream",
-"Отправить местоположение": "Send location",
-"Новый каталог размещения": "New parent directory",
-"Создает новое обсуждение": "Creates a new discussion",
-"Создать товар и подборку": "Create product and selection",
-"Данные файл для загрузки": "Data file for upload",
-"Библиотека: Google Drive": "Library: Google Drive",
-"Путь к объекту оригинала": "Path to the original object",
-"ВывестиНачальнуюСтраницу": "DisplayStartPage",
-"ОписаниеПримитивногоПоля": "PrimitiveFieldDescription",
-"ВК_ПолучитьСписокТоваров": "VK_GetProductList",
-"Получить информацию бота": "Get bot information",
-"Набор тестов для YAxUnit": "Test suite for YAxUnit",
-"СформироватьТестыАссертс": "FormAssertsTests",
-"ПреобразоватьДанныеФайла": "ConvertFileData",
-"ДобавитьПараметрыКоманды": "AddCommandParameters",
-"Массив заголовков кнопок": "Array of button titles",
-"ПолучитьЗаголовкиЗапроса": "GetRequestHeaders",
-"Строка, Массив Из Строка": "String, Array of Strings",
-"Изменить свойство товара": "Edit product property",
-"Строка, Массив из Строка": "String, Array of Strings",
-"СохранитьКартинкуВАльбом": "SaveImageToAlbum",
-"Создать\/Изменить таблицу": "Create\/Edit table",
-"ДобавитьПараметрКартинки": "AddImageParameter",
-"СоздатьВысокуюКлавиатуру": "CreateTallKeyboard",
-"ПолучитьКодПодтверждения": "GetConfirmationCode",
-"Наименование нового поля": "New field name",
-"ТекущаяУниверсальнаяДата": "CurrentUniversalDate",
-"ПолучитьИнформациюОДиске": "GetDiskInformation",
-"СоздатьСсылкуПриглашение": "CreateInvitationLink",
-"СоздатьДлиннуюКлавиатуру": "CreateLongKeyboard",
-"УдалитьКалендарьИзСписка": "DeleteCalendarFromList",
-"Получить список областей": "Get region list",
-"Создать подборку товаров": "Create product selection",
+"СоздатьЗаголовкиЗапроса": "CreateRequestHeaders",
+"ДропБокс_СоздатьКаталог": "Dropbox_CreateFolder",
+"ИзменитьКалендарьСписка": "EditListCalendar",
+"Массив вариантов опроса": "Poll options array",
+"ОбеспечитьПустойКаталог": "EnsureEmptyDirectory",
+"СоздатьПроизвольныйТвит": "CreateCustomTweet",
+"Массив вариантов ответа": "Array of answer options",
+"Проверка_ТелеграмМассив": "Check_TelegramArray",
+"РазделитьДвоичныеДанные": "SplitBinaryData",
+"ОтправитьМестоположение": "SendLocation",
+"УникальныйИдентификатор": "UniqueIdentifier",
+"ОтменитьПубликациюПапки": "CancelFolderPublication",
+"Вайбер_ОтправитьЛокацию": "Viber_SendLocation",
+"ГенераторОтчетаПокрытия": "CoverageReportGenerator",
+"СформироватьМассивМедиа": "FormMediaArray",
+"Получить список каналов": "Get channel list",
+"Путь к объекту удаления": "Path to the object to delete",
+"ПолучитьСтатусОбработки": "GetProcessingStatus",
 "Изменяет название канала": "Changes the name of the channel",
-"ПолучитьСтатистикуПостов": "GetPostStatistics",
-"ДропБокс_ПолучитьАккаунт": "Dropbox_GetAccount",
-"СоздатьРекламнуюКампанию": "CreateAdvertisingCampaign",
-"Ноушн_СоздатьУдалитьБлок": "Notion_CreateDeleteBlock",
-"Проверка_ДропбоксАккаунт": "Check_DropboxAccount",
-"Получить список подборок": "Get selection list",
-"ИзменитьСвойстваСтраницы": "EditPageProperties",
-"РаботаСПодборкамиТоваров": "ProductSelectionManagement",
-"Новое описание календаря": "New calendar description",
-"Создает пустой календарь": "Creates an empty calendar",
+"ВК_ПолучитьСписокТоваров": "VK_GetProductList",
 "Проверка_ТелеграмКонтакт": "Check_TelegramContact",
-"Вайбер_ОтправитьКартинку": "Viber_SendImage",
-"ОбработатьОшибочныйВывод": "HandleErrorOutput",
-"ID целевого пользователя": "Target user ID",
-"ПолучитьСписокКалендарей": "GetCalendarList",
-"D:\\GD\\Мой диск\\data.json": "D:\\GD\\My Drive\\data.json",
-"АргументыКоманднойСтроки": "CommandLineArguments",
-"ОпределитьТекущуюКоманду": "DetermineCurrentCommand",
-"Dropbox_КопироватьОбъект": "Dropbox_CopyObject",
-"Массив товаров или товар": "Array of products or product",
-"ДобавитьРодителяСтраницы": "AddPageParent",
-"ПолучитьСписокРазрешений": "GetPermissionsList",
-"ГК_ПолучитьСписокСобытий": "GC_GetEventList",
-"Признак рекламного поста": "Sign of an advertising post",
-"ГК_СоздатьУдалитьСобытие": "GC_CreateDeleteEvent",
-"ID пользователя адресата": "Recipient user ID",
-"Новый тестовый заголовок": "NewTestTitle",
+"Наименование нового поля": "New field name",
+"ВК_ПолучитьСписокЗаказов": "VK_GetOrderList",
 "ПолучитьПараметрыТвиттер": "GetTwitterParameters",
-"РаботаСУдаленнымиФайлами": "DeletedFilesManagement",
+"ОписаниеПримитивногоПоля": "PrimitiveFieldDescription",
+"Проверка_ДропбоксАккаунт": "Check_DropboxAccount",
+"СоздатьВысокуюКлавиатуру": "CreateTallKeyboard",
+"УдалитьКалендарьИзСписка": "DeleteCalendarFromList",
+"СоздатьДлиннуюКлавиатуру": "CreateLongKeyboard",
+"СформироватьТестыАссертс": "FormAssertsTests",
+"Создает каталог на диске": "Creates a directory on the disk",
+"Набор тестов для YAxUnit": "Test suite for YAxUnit",
+"ДобавитьПараметрКартинки": "AddImageParameter",
+"Новое описание календаря": "New calendar description",
+"Отправить местоположение": "Send location",
+"Строка, Массив из Строка": "String, Array of Strings",
+"Массив заголовков кнопок": "Array of button titles",
+"Новый тестовый заголовок": "NewTestTitle",
+"СоздатьСсылкуПриглашение": "CreateInvitationLink",
+"Dropbox_КопироватьОбъект": "Dropbox_CopyObject",
 "СформироватьБлокКартинку": "GenerateImageBlock",
-"Dropbox_ОпубликоватьПапку": "Dropbox_PublishFolder",
-"ДропБокс_РаботаСДоступами": "Dropbox_AccessManagement",
-"ID пользователей(я) Viber": "Viber User(s) ID",
-"Проверка_ТелеграмКартинка": "Check_TelegramImage",
-"Проверка_ТелеграмДокумент": "Check_TelegramDocument",
-"ПолучитьСписокФайловПапки": "GetListOfFolderFiles",
-"Копирует файл или каталог": "Copies file or directory",
-"OPI_ПолучениеДанныхТестов": "OPI_GetTestData",
-"ПолучитьИнформациюОКанале": "GetChannelInformation",
-"ДобавитьЗаголовокСтраницы": "AddPageHeader",
-"ПереключениеОбщегоДоступа": "TogglePublicAccess",
-"ПоказыватьВыводНемедленно": "ShowOutputImmediately",
-"Статус     : Соответствие": "Status      : Map",
-"ВосстановитьОбъектКВерсии": "RestoreObjectToVersion",
-"Создать\/Удалить календарь": "Create\/Delete calendar",
-"ОтменитьПубликациюОбъекта": "CancelObjectPublication",
-"Получить публичный объект": "Get public object",
-"Преобразовать код в токен": "Convert code to token",
-"Проверка_ДропбоксУчастник": "Check_DropboxMember",
-"РаботаСоСпискомКалендарей": "CalendarListManagement",
-"Новый альбом из автотеста": "NewAlbumFromAutoTest",
-"Заполнить\/Очистить ячейки": "Fill\/Clear cells",
-"ОчиститьОсновнойКалендарь": "ClearMainCalendar",
-"URL для установки Webhook": "URL for setting up Webhook",
-"Добавить\/Удалить картинку": "Add\/Delete image",
-"Создает твит без вложений": "Creates a tweet without attachments",
-"Ноушн_СоздатьИзменитьБазу": "Notion_CreateEditDatabase",
-"Получить календарь списка": "Get list calendar",
-"Твиттер_СоздатьТвитСВидео": "Twitter_CreateTweetWithVideo",
-"ВК_ПолучитьСписокПодборок": "VK_GetSelectionList",
-"Заголовок файла для Slack": "File title for Slack",
-"Библиотека: Google Sheets": "Library: Google Sheets",
-"Тестовый товар измененный": "EditedTestProduct",
+"ПолучитьКодПодтверждения": "GetConfirmationCode",
+"Ноушн_СоздатьУдалитьБлок": "Notion_CreateDeleteBlock",
+"ДропБокс_ПолучитьАккаунт": "Dropbox_GetAccount",
+"Изменить свойство товара": "Edit product property",
+"Создает пустой календарь": "Creates an empty calendar",
+"ПолучитьСписокКалендарей": "GetCalendarList",
+"ПолучитьИнформациюОДиске": "GetDiskInformation",
+"ДобавитьКалендарьВСписок": "AddCalendarToList",
+"РаботаСУдаленнымиФайлами": "DeletedFilesManagement",
+"Массив товаров или товар": "Array of products or product",
+"ID пользователя адресата": "Recipient user ID",
+"Библиотека: Google Drive": "Library: Google Drive",
+"ПолучитьСтатистикуПостов": "GetPostStatistics",
+"ДобавитьРодителяСтраницы": "AddPageParent",
+"СоздатьРекламнуюКампанию": "CreateAdvertisingCampaign",
+"Файл источник обновления": "File source for update",
+"ПолучитьДвоичныеИлиПоток": "GetBinaryOrStream",
+"ПолучитьСписокРазрешений": "GetPermissionsList",
+"ИзменитьСвойстваСтраницы": "EditPageProperties",
+"Данные файл для загрузки": "Data file for upload",
+"Получить данные аккаунта": "Get account data",
+"Создать\/Изменить таблицу": "Create\/Edit table",
+"Получить список областей": "Get region list",
+"Вайбер_ОтправитьКартинку": "Viber_SendImage",
+"ПолучитьЗаголовкиЗапроса": "GetRequestHeaders",
+"D:\\GD\\Мой диск\\data.json": "D:\\GD\\My Drive\\data.json",
+"Признак рекламного поста": "Sign of an advertising post",
+"ТекущаяУниверсальнаяДата": "CurrentUniversalDate",
+"Путь к целевому каталогу": "Path to the target directory",
+"Новый каталог размещения": "New parent directory",
+"ГК_ПолучитьСписокСобытий": "GC_GetEventList",
+"ОпределитьТекущуюКоманду": "DetermineCurrentCommand",
+"АргументыКоманднойСтроки": "CommandLineArguments",
+"ВывестиНачальнуюСтраницу": "DisplayStartPage",
+"Ссылка (URL) под записью": "Link (URL) under the post",
+"ДобавитьПараметрыКоманды": "AddCommandParameters",
+"Строка, Массив Из Строка": "String, Array of Strings",
+"РазложитьОбъектыПодробно": "BreakDownObjectsInDetail",
+"СохранитьКартинкуВАльбом": "SaveImageToAlbum",
+"Путь к объекту оригинала": "Path to the original object",
+"Загрузить фото на сервер": "Upload photo to server",
+"ОбработатьОшибочныйВывод": "HandleErrorOutput",
+"Создает новое обсуждение": "Creates a new discussion",
+"ГК_СоздатьУдалитьСобытие": "GC_CreateDeleteEvent",
+"ПреобразоватьДанныеФайла": "ConvertFileData",
+"Создать товар и подборку": "Create product and selection",
+"ВК_ПолучитьСписокСвойств": "VK_GetPropertyList",
+"Создать подборку товаров": "Create product selection",
+"РаботаСПодборкамиТоваров": "ProductSelectionManagement",
+"ID целевого пользователя": "Target user ID",
+"Получить список подборок": "Get selection list",
+"Получить информацию бота": "Get bot information",
 "ПолучениеДанныхИНастройка": "DataRetrievalAndSettings",
-"Изменить календарь списка": "Edit list calendar",
-"ЯДиск_СоздатьКопиюОбъекта": "YDisk_CreateObjectCopy",
-"Отменить публикацию файла": "Unpublish file",
-"Создает новую базу данных": "Creates a new database",
-"ЭкранированиеСимволовJSON": "EscapeJSONCharacters",
-"ДобавитьИдентификаторЧата": "AddChatIdentifier",
-"ИзменитьНаименованиеКниги": "EditBookTitle",
-"Устанавливает тему канала": "Sets the channel topic",
-"Получить число участников": "Get participant count",
-"Наименование нового листа": "NewSheetName",
 "Создать произвольный твит": "Create custom tweet",
-"Телеграм_ОтправитьКонтакт": "Telegram_SendContact",
-"Telegram_ОтправитьКонтакт": "Telegram_SendContact",
+"ПоказыватьВыводНемедленно": "ShowOutputImmediately",
+"Наименование нового листа": "NewSheetName",
+"ИзменитьНаименованиеКниги": "EditBookTitle",
+"ДобавитьЗаголовокСтраницы": "AddPageHeader",
+"Статус     : Соответствие": "Status      : Map",
+"URL для установки Webhook": "URL for setting up Webhook",
+"Путь назначения для копии": "Destination path for the copy",
+"Проверка_ДропбоксУчастник": "Check_DropboxMember",
+"ДобавитьИдентификаторЧата": "AddChatIdentifier",
+"Добавить\/Удалить картинку": "Add\/Delete image",
+"РаботаСоСпискомКалендарей": "CalendarListManagement",
+"ПоказатьГлавнуюТемуФорума": "ShowMainForumTopic",
+"См.ПолучитьОписаниеТовара": "See GetProductDescription",
+"СоответствиеКомандМодулей": "ModuleCommandMapping",
+"Архивирует активный канал": "Archives an active channel",
+"ПолучитьСсылкуАвторизации": "GetAuthorizationLink",
+"ЯДиск_СоздатьКопиюОбъекта": "YDisk_CreateObjectCopy",
+"ОтменитьПубликациюОбъекта": "CancelObjectPublication",
+"Проверка_ТелеграмКартинка": "Check_TelegramImage",
 "Установить значения ячеек": "SetCellValues",
-"ПолучитьСсылкуНаСообщение": "GetMessageLink",
-"Отменить публикацию папки": "Unpublish folder",
-"Изменить имя главной темы": "Change main topic name",
+"РаботаСРекламнымКабинетом": "AdAccountManagement",
+"ПереключениеОбщегоДоступа": "TogglePublicAccess",
+"Номер рекламной категории": "Advertising category number",
+"Проверка_ТелеграмДокумент": "Check_TelegramDocument",
+"Изменить подборку товаров": "Edit product selection",
+"Получить публичный объект": "Get public object",
+"Загрузить видео на сервер": "Upload video to server",
+"Telegram_ОтправитьКонтакт": "Telegram_SendContact",
+"Добавить товар в подборку": "Add product to selection",
 "Слак_ЗагрузитьУдалитьФайл": "Slack_UploadDeleteFile",
 "Слак_ПолучитьСписокФайлов": "Slack_GetFileList",
+"ОчиститьОсновнойКалендарь": "ClearMainCalendar",
 "Слак_ОткрытьЗакрытьДиалог": "Slack_OpenCloseDialog",
-"ПоказатьГлавнуюТемуФорума": "ShowMainForumTopic",
-"СоответствиеКомандМодулей": "ModuleCommandMapping",
-"ВыполнитьЗапросМультипарт": "ExecuteMultipartRequest",
-"Архивирует активный канал": "Archives an active channel",
-"Удаляет комментарий по ID": "Deletes comment by ID",
-"Dropbox_ПереместитьОбъект": "Dropbox_MoveObject",
-"Путь назначения для копии": "Destination path for the copy",
+"Dropbox_ОпубликоватьПапку": "Dropbox_PublishFolder",
+"ДропБокс_РаботаСДоступами": "Dropbox_AccessManagement",
+"Телеграм_ОтправитьКонтакт": "Telegram_SendContact",
+"Преобразовать код в токен": "Convert code to token",
+"Создает твит без вложений": "Creates a tweet without attachments",
+"ВК_ПолучитьСписокПодборок": "VK_GetSelectionList",
+"OPI_ПолучениеДанныхТестов": "OPI_GetTestData",
+"Получить число участников": "Get participant count",
 "Некорректный вид отправки": "Incorrect sending view",
-"Удалить товар из подборки": "Remove product from selection",
-"Номер рекламной категории": "Advertising category number",
-"См.ПолучитьОписаниеТовара": "See GetProductDescription",
-"Загрузить видео на сервер": "Upload video to server",
-"Создает пост с картинками": "Creates a post with images",
-"ВыполнитьОбработкуКоманды": "ExecuteCommandProcessing",
-"Идентификатор комментария": "Comment identifier",
-"РаботаСоСвойствамиТоваров": "ProductPropertiesManagement",
-"РаботаСРекламнымКабинетом": "AdAccountManagement",
-"ПолучитьСсылкуАвторизации": "GetAuthorizationLink",
-"РаботаСФайламиИКаталогами": "FileAndDirectoryManagement",
-"См. ПолучитьОписаниеФайла": "See GetFileDescription",
+"ПолучитьСсылкуНаСообщение": "GetMessageLink",
+"Отменить публикацию файла": "Unpublish file",
+"Твиттер_СоздатьТвитСВидео": "Twitter_CreateTweetWithVideo",
+"Создать\/Удалить календарь": "Create\/Delete calendar",
 "Получить список каталогов": "Get list of directories",
-"Добавить товар в подборку": "Add product to selection",
-"Изменить подборку товаров": "Edit product selection",
+"ЭкранированиеСимволовJSON": "EscapeJSONCharacters",
+"Тестовый товар измененный": "EditedTestProduct",
+"ВыполнитьЗапросМультипарт": "ExecuteMultipartRequest",
+"МобильноеПриложениеКлиент": "MobileAppClient",
+"МобильноеПриложениеСервер": "MobileAppServer",
+"Dropbox_ПереместитьОбъект": "Dropbox_MoveObject",
+"Новый альбом из автотеста": "NewAlbumFromAutoTest",
+"ВосстановитьОбъектКВерсии": "RestoreObjectToVersion",
+"Изменить имя главной темы": "Change main topic name",
+"Изменить календарь списка": "Edit list calendar",
+"Заголовок файла для Slack": "File title for Slack",
+"Заполнить\/Очистить ячейки": "Fill\/Clear cells",
+"РаботаСоСвойствамиТоваров": "ProductPropertiesManagement",
+"Удаляет комментарий по ID": "Deletes comment by ID",
+"Устанавливает тему канала": "Sets the channel topic",
+"См. ПолучитьОписаниеФайла": "See GetFileDescription",
 "Идентификатор базы данных": "Database identifier",
-"Слак_ПолучитьСписокКаналов": "Slack_GetChannelList",
-"Telegram_УдалитьТемуФорума": "Telegram_DeleteForumTopic",
+"Копирует файл или каталог": "Copies file or directory",
+"ПолучитьСписокФайловПапки": "GetListOfFolderFiles",
+"ID пользователей(я) Viber": "Viber User(s) ID",
+"Библиотека: Google Sheets": "Library: Google Sheets",
+"ПолучитьИнформациюОКанале": "GetChannelInformation",
+"Ноушн_СоздатьИзменитьБазу": "Notion_CreateEditDatabase",
+"Идентификатор комментария": "Comment identifier",
+"Создает пост с картинками": "Creates a post with images",
+"Получить календарь списка": "Get list calendar",
+"Отменить публикацию папки": "Unpublish folder",
+"ВыполнитьОбработкуКоманды": "ExecuteCommandProcessing",
+"РаботаСФайламиИКаталогами": "FileAndDirectoryManagement",
+"Удалить товар из подборки": "Remove product from selection",
+"Создает новую базу данных": "Creates a new database",
+"Telegram_УстановитьWebhook": "Telegram_SetWebhook",
 "УдалитьПустыеКлючиЗначения": "RemoveEmptyKeyValues",
-"СоздатьРекламноеОбъявление": "CreateAd",
-"Получить информацию о боте": "Get bot information",
-"Число знаков после запятой": "Number of decimal places",
-"Описание тестового события": "TestEventDescription",
-"ГК_СоздатьУдалитьКалендарь": "GC_CreateDeleteCalendar",
-"ГД_ПолучитьСписокКаталогов": "GD_GetCatalogList",
 "МинимальныйРазмерДляПотока": "MinimumStreamSize",
-"Получает схему таблиц базы": "Gets the schema of base tables",
-"УдалитьПустыеПоляКоллекции": "RemoveEmptyCollectionFields",
-"КраткоеПредставлениеОшибки": "BriefErrorRepresentation",
-"Наименование новой таблицы": "New table name",
 "ЧислоСтандартныхПараметров": "NumberOfStandardParameters",
+"Телеграм_УстановитьWebhook": "Telegram_SetWebhook",
+"ПолучитьЗначенияРекурсивно": "GetValuesRecursively",
+"ВывестиСправкуПоПараметрам": "DisplayParameterHelp",
+"ОжидатьЗавершенияОбработки": "WaitForProcessingCompletion",
+"Мне больше нравится желтый": "I like yellow more",
+"ЯДиск_ЗагрузитьУдалитьФайл": "YDisk_UploadDeleteFile",
+"Telegram_ОтправитьКартинку": "Telegram_SendPicture",
+"Наименование новой таблицы": "New table name",
+"ГД_ПолучитьСписокКаталогов": "GD_GetCatalogList",
+"Число знаков после запятой": "Number of decimal places",
+"ПолучитьДанныеПользователя": "GetUserData",
+"СлужебныеПроцедурыИФункции": "ServiceProceduresAndFunctions",
+"Получает комментарий по ID": "Gets comment by ID",
+"ПолучитьСписокКомментариев": "GetCommentList",
+"СформироватьЗначенияВыбора": "FormSelectionValues",
+"Получает схему таблиц базы": "Gets the schema of base tables",
+"ГТ_ЗаполнитьОчиститьЯчейки": "GT_FillClearCells",
+"ВывестиСообщениеИсключения": "DisplayExceptionMessage",
+"Получить список календарей": "Get list of calendars",
+"Ноушн_СоздатьСтраницуВБазу": "Notion_CreatePageInDatabase",
 "ПолучитьРезультатОбработки": "GetProcessingResult",
+"Массив соответствий файлов": "Array of file mappings",
+"Telegram_УдалитьТемуФорума": "Telegram_DeleteForumTopic",
+"Telegram_ОткрытьТемуФорума": "Telegram_OpenForumTopic",
+"Telegram_ЗакрытьТемуФорума": "Telegram_CloseForumTopic",
+"Telegram_СоздатьТемуФорума": "Telegram_CreateForumTopic",
+"Добавляет товар в подборку": "Adds a product to the selection",
+"Слак_ПолучитьСписокКаналов": "Slack_GetChannelList",
+"ЯДиск_ПолучитьСписокФайлов": "YDisk_GetFileList",
 "Telegram_ОтправитьДокумент": "Telegram_SendDocument",
 "Телеграм_ОтправитьДокумент": "Telegram_SendDocument",
-"Сформировать блок картинку": "Generate image block",
-"Получить категории товаров": "Get product categories",
-"Telegram_ОтправитьКартинку": "Telegram_SendPicture",
+"Описание тестового события": "TestEventDescription",
 "Телеграм_ОтправитьКартинку": "Telegram_SendImage",
-"ОбработатьТабуляциюСправки": "HandleHelpTabulation",
-"Telegram_УстановитьWebhook": "Telegram_SetWebhook",
-"Телеграм_УстановитьWebhook": "Telegram_SetWebhook",
-"ЗаполнитьПоляЗапросаТовара": "FillProductRequestFields",
-"Получить статистику постов": "Get post statistics",
-"Добавляет товар в подборку": "Adds a product to the selection",
-"Создать рекламную кампанию": "Create advertising campaign",
-"Ноушн_СоздатьСтраницуВБазу": "Notion_CreatePageInDatabase",
-"ДобавитьПользователяКФайлу": "AddUserToFile",
-"Массив соответствий файлов": "Array of file mappings",
-"Получает комментарий по ID": "Gets comment by ID",
-"Telegram_СоздатьТемуФорума": "Telegram_CreateForumTopic",
-"Telegram_ЗакрытьТемуФорума": "Telegram_CloseForumTopic",
-"ПолучитьЗначенияРекурсивно": "GetValuesRecursively",
-"Telegram_ОткрытьТемуФорума": "Telegram_OpenForumTopic",
-"ОжидатьЗавершенияОбработки": "WaitForProcessingCompletion",
-"Dropbox_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL",
-"ГТ_ЗаполнитьОчиститьЯчейки": "GT_FillClearCells",
-"ДропБокс_СоздатьУдалитьТег": "Dropbox_CreateDeleteTag",
-"ЯДиск_ПолучитьСписокФайлов": "YDisk_GetFileList",
-"ЯДиск_ЗагрузитьУдалитьФайл": "YDisk_UploadDeleteFile",
-"ID оригинального сообщения": "Original message ID",
-"Проверка_ВККартинкаАльбома": "Check_VKAlbumPicture",
-"ВывестиСообщениеИсключения": "DisplayExceptionMessage",
-"ПолучитьСписокКомментариев": "GetCommentList",
-"Получить информацию о базе": "Get database info",
-"Создать ссылку-приглашение": "Create invitation link",
-"Изменить свойства страницы": "Edit page properties",
-"Структура Из КлючИЗначение": "Structure of Key-Value",
-"СлужебныеПроцедурыИФункции": "ServiceProceduresAndFunctions",
-"Путь сохранения на Dropbox": "Save path on Dropbox",
 "Скрыть главную тему форума": "Hide main forum thread",
-"ВывестиСправкуПоПараметрам": "DisplayParameterHelp",
-"СлужебныеПроцедурыИфункции": "ServiceProceduresAndFunctions",
-"Получить список календарей": "Get list of calendars",
-"разрешение на методы Drive": "Drive methods permission",
-"НормализоватьТекстовыйВвод": "NormalizeTextInput",
-"Проверка_ТелеграмПереслать": "Check_TelegramForward",
 "Очищает значение в ячейках": "Clears the value in cells",
-"Получить информацию канала": "Get channel info",
-"Создать\/Архивировать канал": "Create\/Archive channel",
-"Мне больше нравится желтый": "I like yellow more",
-"ПреобразоватьВариантВыбора": "ConvertSelectionOption",
-"ПолучитьДанныеПользователя": "GetUserData",
+"НормализоватьТекстовыйВвод": "NormalizeTextInput",
+"СоздатьРекламноеОбъявление": "CreateAd",
+"Dropbox_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL",
+"ДропБокс_СоздатьУдалитьТег": "Dropbox_CreateDeleteTag",
+"Получить категории товаров": "Get product categories",
 "Dropbox_ПолчитьСписокТегов": "Dropbox_GetTagList",
-"ПреобразоватьПользователей": "ConvertUsers",
-"Проверка_ТелеграмСообщение": "Check_TelegramMessage",
+"ЗаполнитьПоляЗапросаТовара": "FillProductRequestFields",
+"Получить информацию о боте": "Get bot information",
+"Структура Из КлючИЗначение": "Structure of Key-Value",
+"ID оригинального сообщения": "Original message ID",
+"Проверка_ТелеграмПереслать": "Check_TelegramForward",
+"УдалитьПустыеПоляКоллекции": "RemoveEmptyCollectionFields",
+"Создать рекламную кампанию": "Create advertising campaign",
+"ДобавитьПользователяКФайлу": "AddUserToFile",
+"Сформировать блок картинку": "Generate image block",
+"разрешение на методы Drive": "Drive methods permission",
 "ПолучитьИмяВременногоФайла": "GetTempFileName",
+"Проверка_ТелеграмСообщение": "Check_TelegramMessage",
+"Получить статистику постов": "Get post statistics",
+"ОбработатьТабуляциюСправки": "HandleHelpTabulation",
+"ПреобразоватьВариантВыбора": "ConvertSelectionOption",
+"Путь сохранения на Dropbox": "Save path on Dropbox",
+"Получить информацию канала": "Get channel info",
+"Получить информацию о базе": "Get database info",
+"Изменить свойства страницы": "Edit page properties",
+"ПреобразоватьПользователей": "ConvertUsers",
+"Создать ссылку-приглашение": "Create invitation link",
+"СлужебныеПроцедурыИфункции": "ServiceProceduresAndFunctions",
+"КраткоеПредставлениеОшибки": "BriefErrorRepresentation",
+"Проверка_ВККартинкаАльбома": "Check_VKAlbumPicture",
+"Создать\/Архивировать канал": "Create\/Archive channel",
 "Получить код подтверждения": "Get confirmation code",
-"СформироватьЗначенияВыбора": "FormSelectionValues",
-"Создает историю из картинки": "Creates a story from an image",
-"Телеграм_ПереслатьСообщение": "Telegram_ForwardMessage",
-"Telegram_ПереслатьСообщение": "Telegram_ForwardMessage",
-"ДобавитьПользователейКФайлу": "AddUsersToFile",
-"ВК_ПолучитьСтатистикуПостов": "VK_GetPostStatistics",
-"ВК_СохранитьУдалитьКартинку": "VK_SaveDeleteImage",
-"Создать\/Удалить тему форума": "Create\/Delete forum topic",
-"Ключ > ID, Значение > Emoji": "Key > ID, Value > Emoji",
-"ВК_СоздатьРекламнуюКампанию": "VK_CreateAdCampaign",
-"НастройкиСовместногоДоступа": "SharedAccessSettings",
-"Массив каналов для отправки": "Array of channels for sending",
-"Библиотека: Google Calendar": "Library: Google Calendar",
-"ЗащищенноеСоединениеOpenSSL": "SecureConnectionOpenSSL",
-"ВК_ПолучитьКатегорииТоваров": "VK_GetProductCategories",
-"ID целевой стены или группы": "ID of the target wall or group",
-"ЗаписатьБуферДвоичныхДанных": "WriteBinaryDataBuffer",
-"ID альбома, если необходимо": "Album ID, if necessary",
-"ID стены расположения поста": "ID of the wall where the post is located",
-"ДобавитьПользователейКПапке": "AddUsersToFolder",
-"ВК_СоздатьТоварСоСвойствами": "VK_CreateProductWithProperties",
-"Telegram_ИзменитьТемуФорума": "Telegram_EditForumTopic",
-"СформироватьМассивИменЯчеек": "FormCellNameArray",
-"ОтправитьТекстовоеСообщение": "SendTextMessage",
-"Добавить календарь в список": "Add calendar to list",
-"VK_СохранитьКартинкуВАльбом": "VK_SavePictureToAlbum",
-"Удалить картинку из альбома": "Deletes an image from the album",
-"Telegram_ОткрепитьСообщение": "Telegram_UnpinMessage",
-"Изменить наименование книги": "ChangeBookName",
-"Telegram_ЗакрепитьСообщение": "Telegram_PinMessage",
-"Сохранить картинку в альбом": "Save image to album",
-"ГК_ПолучитьСписокКалендарей": "GC_GetCalendarList",
-"СформироватьОписаниеТаблицы": "GenerateTableDescription",
-"Создать\/Удалить кооментарий": "Create\/Delete Comment",
-"ПолучитьСписокВерсийОбъекта": "GetObjectVersionList",
-"ЗаписатьПараметрыМультипарт": "WriteMultipartParameters",
-"ПолучитьСписокПользователей": "GetUserList",
-"ДропБокс_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL",
-"Получить информацию о диске": "Get disk information",
-"Массив соответствий товаров": "Array of product matches",
-"ПолучитьМетаданныеКалендаря": "GetCalendarMetadata",
-"Разложить JSON на параметры": "Parse JSON to Parameters",
-"Удалить календарь из списка": "Remove calendar from list",
-"ИзменитьМетаданныеКалендаря": "EditCalendarMetadata",
-"Отменить публикацию объекта": "Unpublish object",
-"Очистить основной календарь": "Clear primary calendar",
-"Путь к публикуемому объекту": "Path to the object to be published",
-"ПолучитьИнформациюОбОбъекте": "GetObjectInformation",
-"УправлениеПубличнымДоступом": "ManagePublicAccess",
-"Проверка_ДропБоксМетаданные": "Check_DropboxMetadata",
-"ПолучитьСтатусЗагрузкиПоURL": "GetUploadStatusByURL",
-"Создет новое поле в таблице": "Creates a new field in the table",
-"ПреобразоватьЗначениеПоТипу": "ConvertValueByType",
-"URL для перехода в браузере": "URL for browser transition",
-"Получить ссылку авторизации": "Get authorization link",
-"Отправить\/Удалить эфемерное": "Send\/Delete ephemeral",
-"ПолучитьОнлайнПользователей": "GetOnlineUsers",
-"Отправить\/Удалить сообщение": "Send\/Delete message",
-"ПолучитьСсылкуДляСкачивания": "GetDownloadLink",
-"Путь к файлу для скачивания": "Path to the file for downloading",
-"разрешение на методы Sheets": "Sheets methods permission",
-"ОтправитьЭфемерноеСообщение": "SendEphemeralMessage",
-"Тип отправляемого сообщения": "TypeOfSentMessage",
-"URL для кнопки под историей": "URL for button under the story",
-"Временная отметка сообщения": "Message timestamp",
-"ПолучитьСписокВнешнихФайлов": "GetExternalFileList",
-"Создать товар со свойствами": "Create product with properties",
-"Загрузить по URL и получить": "Upload by URL and get",
-"Получает информацию о файле": "Gets information about the file",
-"Telegram_ПолучитьОбновления": "Telegram_GetUpdates",
-"Телеграм_ПолучитьОбновления": "Telegram_GetUpdates",
-"Твиттер_СоздатьТвитСОпросом": "Twitter_CreateTweetWithPoll",
-"ДобавитьПараметрФлагКоманды": "AddCommandFlagParameter",
-"ВыгнатьПользователяИзКанала": "KickUserFromChannel",
-"Код со страницы авторизации": "Code from the authorization page",
+"ГК_СоздатьУдалитьКалендарь": "GC_CreateDeleteCalendar",
 "Ноушн_ПолучитьПользователей": "Notion_GetUsers",
 "ВернутьСтандартныеПараметры": "ReturnStandardParameters",
-"Массив соответствий событий": "Array of event mappings",
 "Слак_ПолучитьСписокОбластей": "Slack_GetRegionList",
-"Получить данные пользователя": "Get user data",
-"Библиотека: Google Workspace": "Library: Google Workspace",
-"ПолучитьСписокИконокАватаров": "GetAvatarIconList",
-"ПодробноеПредставлениеОшибки": "DetailedErrorRepresentation",
-"Создает новую таблицу в базе": "Creates a new table in the base",
-"РаботаСМетаданнымиКалендарей": "CalendarMetadataManagement",
-"Твиттер_СоздатьТекстовыйТвит": "Twitter_CreateTextTweet",
-"JSON массива описаний блоков": "JSON array of block descriptions",
-"Получить ссылку на сообщение": "Get message link",
-"URL картинки иконки страницы": "URL of the page icon image",
-"C:\\GDrive\\Мой диск\\data.json": "C:\\GDrive\\My Drive\\data.json",
-"Получает описание поля с URL": "Gets the description of a URL field",
-"Добавляет новый внешний файл": "Adds a new external file",
-"Создать рекламное объявление": "Create advertising post",
-"Массив соответствий подборок": "Array of selection matches",
+"Массив каналов для отправки": "Array of channels for sending",
+"Telegram_ИзменитьТемуФорума": "Telegram_EditForumTopic",
+"Проверка_ДропБоксМетаданные": "Check_DropboxMetadata",
+"Создает историю из картинки": "Creates a story from an image",
+"Удалить календарь из списка": "Remove calendar from list",
+"ПолучитьСсылкуДляСкачивания": "GetDownloadLink",
+"ОтправитьЭфемерноеСообщение": "SendEphemeralMessage",
+"Создать\/Удалить кооментарий": "Create\/Delete Comment",
+"Путь к файлу для скачивания": "Path to the file for downloading",
+"ЗащищенноеСоединениеOpenSSL": "SecureConnectionOpenSSL",
+"Библиотека: Google Calendar": "Library: Google Calendar",
+"ВК_ПолучитьСтатистикуПостов": "VK_GetPostStatistics",
+"Добавить календарь в список": "Add calendar to list",
+"ПолучитьОнлайнПользователей": "GetOnlineUsers",
+"Получить информацию о диске": "Get disk information",
+"Отправить\/Удалить сообщение": "Send\/Delete message",
+"Отправить\/Удалить эфемерное": "Send\/Delete ephemeral",
+"ДобавитьПараметрФлагКоманды": "AddCommandFlagParameter",
+"ЗаписатьБуферДвоичныхДанных": "WriteBinaryDataBuffer",
+"ПолучитьСписокПользователей": "GetUserList",
+"Твиттер_СоздатьТвитСОпросом": "Twitter_CreateTweetWithPoll",
+"ВК_ПолучитьКатегорииТоваров": "VK_GetProductCategories",
+"Изменить наименование книги": "ChangeBookName",
+"Временная отметка сообщения": "Message timestamp",
+"ДобавитьПользователейКПапке": "AddUsersToFolder",
+"VK_СохранитьКартинкуВАльбом": "VK_SavePictureToAlbum",
+"ОтправитьТекстовоеСообщение": "SendTextMessage",
+"ВК_СохранитьУдалитьКартинку": "VK_SaveDeleteImage",
+"ВыгнатьПользователяИзКанала": "KickUserFromChannel",
+"Получает информацию о файле": "Gets information about the file",
+"Массив соответствий товаров": "Array of product matches",
+"URL для кнопки под историей": "URL for button under the story",
+"ПреобразоватьЗначениеПоТипу": "ConvertValueByType",
+"Телеграм_ПолучитьОбновления": "Telegram_GetUpdates",
+"Код со страницы авторизации": "Code from the authorization page",
+"ВК_СоздатьТоварСоСвойствами": "VK_CreateProductWithProperties",
+"Telegram_ПолучитьОбновления": "Telegram_GetUpdates",
+"Сохранить картинку в альбом": "Save image to album",
+"Тип отправляемого сообщения": "TypeOfSentMessage",
+"ИзменитьМетаданныеКалендаря": "EditCalendarMetadata",
+"Создать\/Удалить тему форума": "Create\/Delete forum topic",
+"Массив соответствий событий": "Array of event mappings",
+"ДропБокс_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL",
+"Создет новое поле в таблице": "Creates a new field in the table",
+"СформироватьМассивИменЯчеек": "FormCellNameArray",
+"Создать товар со свойствами": "Create product with properties",
+"ID стены расположения поста": "ID of the wall where the post is located",
+"ДобавитьПользователейКФайлу": "AddUsersToFile",
+"ID целевой стены или группы": "ID of the target wall or group",
+"ПолучитьСтатусЗагрузкиПоURL": "GetUploadStatusByURL",
+"ПолучитьМетаданныеКалендаря": "GetCalendarMetadata",
+"ПолучитьСписокВнешнихФайлов": "GetExternalFileList",
+"разрешение на методы Sheets": "Sheets methods permission",
+"ГК_ПолучитьСписокКалендарей": "GC_GetCalendarList",
+"СформироватьОписаниеТаблицы": "GenerateTableDescription",
+"ВК_СоздатьРекламнуюКампанию": "VK_CreateAdCampaign",
+"Получить ссылку авторизации": "Get authorization link",
+"НастройкиСовместногоДоступа": "SharedAccessSettings",
+"Telegram_ОткрепитьСообщение": "Telegram_UnpinMessage",
+"Telegram_ЗакрепитьСообщение": "Telegram_PinMessage",
+"Ключ > ID, Значение > Emoji": "Key > ID, Value > Emoji",
+"ПолучитьИнформациюОбОбъекте": "GetObjectInformation",
+"URL для перехода в браузере": "URL for browser transition",
+"Очистить основной календарь": "Clear primary calendar",
+"Телеграм_ПереслатьСообщение": "Telegram_ForwardMessage",
+"Удалить картинку из альбома": "Deletes an image from the album",
+"ЗаписатьПараметрыМультипарт": "WriteMultipartParameters",
+"Telegram_ПереслатьСообщение": "Telegram_ForwardMessage",
+"ПолучитьСписокВерсийОбъекта": "GetObjectVersionList",
+"ID альбома, если необходимо": "Album ID, if necessary",
+"Загрузить по URL и получить": "Upload by URL and get",
+"Разложить JSON на параметры": "Parse JSON to Parameters",
+"Отменить публикацию объекта": "Unpublish object",
+"Путь к публикуемому объекту": "Path to the object to be published",
+"УправлениеПубличнымДоступом": "ManagePublicAccess",
 "Время ожидания новых событий": "Waiting time for new events",
-"УдалитьВариантСвойстваТовара": "DeleteProductPropertyVariant",
 "Обсуждаем: какой цвет лучше?": "Discussing: Which color is better?",
-"Получает информацию о канале": "Gets information about the channel",
-"ГД_СоздатьУдалитьКомментарий": "GD_CreateDeleteComment",
-"ПреобразоватьBase64ВДвоичные": "ConvertBase64ToBinary",
-"Проверка_ТелеграмПриглашение": "Check_TelegramInvitation",
-"Слак_ПолучитьИнформациюОБоте": "Slack_GetBotInfo",
-"JSON файлов или путь к .json": "File JSON or path to .json",
-"Отправить группу медиафайлов": "Send media group",
-"ГВ_ПолучитьСсылкуАвторизации": "GV_GetAuthorizationLink",
-"Проверка_ТелеграмМедиагруппа": "Check_TelegramMediaGroup",
-"ПреобразоватьПараметрВСтроку": "ConvertParameterToString",
-"ПолучитьЗаголовокАвторизации": "GetAuthorizationHeader",
-"Добавляет новый лист в книгу": "Adds a new sheet to the book",
-"Получить список файлов папки": "Get list of folder files",
-"СледующаяВложенностьДоступна": "NextNestingAvailable",
-"Получить список комментариев": "Get list of comments",
-"Эти токены обновлять не надо": "These tokens do not need to be updated",
-"ПолучитьИнформациюОбАккаунте": "GetAccountInformation",
-"СоздатьСсылкуПолученияТокена": "CreateTokenRetrievalLink",
-"ИзменитьИмяГлавнойТемыФорума": "EditMainForumTopicName",
-"Массив сформированных кнопок": "Array of formed buttons",
-"УдалитьПустыеЭлементыМассива": "RemoveEmptyArrayElements",
-"Показать главную тему форума": "Show main forum thread",
-"Восстановить объект к версии": "Restore object to version",
-"Получить список внеш. файлов": "Get external file list",
-"Загрузить\/Удалить внеш. файл": "Upload\/Delete external file",
-"ПолучитьСтандартныеПараметры": "GetStandardParameters",
-"Получить информацию о канале": "Get channel information",
 "Скрывает главную тему форума": "Hides the main forum thread",
-"Скрыть\/Показать главную тему": "Hide\/Show main topic",
+"Создает новую таблицу в базе": "Creates a new table in the base",
+"Получить список комментариев": "Get list of comments",
+"Массив сформированных кнопок": "Array of formed buttons",
+"ПолучитьСписокИконокАватаров": "GetAvatarIconList",
 "HEX цвет кнопок с # в начале": "HEX color of buttons with # at the beginning",
+"Твиттер_СоздатьТекстовыйТвит": "Twitter_CreateTextTweet",
+"СоздатьСсылкуПолученияТокена": "CreateTokenRetrievalLink",
+"ПолучитьИнформациюОбАккаунте": "GetAccountInformation",
+"Восстановить объект к версии": "Restore object to version",
+"ПреобразоватьBase64ВДвоичные": "ConvertBase64ToBinary",
+"ГД_СоздатьУдалитьКомментарий": "GD_CreateDeleteComment",
+"Получить список файлов папки": "Get list of folder files",
+"Проверка_ТелеграмМедиагруппа": "Check_TelegramMediaGroup",
+"Добавляет новый внешний файл": "Adds a new external file",
+"УдалитьПустыеЭлементыМассива": "RemoveEmptyArrayElements",
+"Создать рекламное объявление": "Create advertising post",
+"Показать главную тему форума": "Show main forum thread",
+"Получает информацию о канале": "Gets information about the channel",
+"Получить данные пользователя": "Get user data",
+"Отправить группу медиафайлов": "Send media group",
+"JSON файлов или путь к .json": "File JSON or path to .json",
+"Получить ссылку на сообщение": "Get message link",
+"Скрыть\/Показать главную тему": "Hide\/Show main topic",
+"ПодробноеПредставлениеОшибки": "DetailedErrorRepresentation",
+"Библиотека: Google Workspace": "Library: Google Workspace",
+"УдалитьВариантСвойстваТовара": "DeleteProductPropertyVariant",
+"ПреобразоватьПараметрВСтроку": "ConvertParameterToString",
+"Проверка_ТелеграмПриглашение": "Check_TelegramInvitation",
+"СледующаяВложенностьДоступна": "NextNestingAvailable",
+"URL картинки иконки страницы": "URL of the page icon image",
+"ПолучитьЗаголовокАвторизации": "GetAuthorizationHeader",
+"РаботаСМетаданнымиКалендарей": "CalendarMetadataManagement",
+"ИзменитьИмяГлавнойТемыФорума": "EditMainForumTopicName",
+"Получает описание поля с URL": "Gets the description of a URL field",
+"C:\\GDrive\\Мой диск\\data.json": "C:\\GDrive\\My Drive\\data.json",
+"Слак_ПолучитьИнформациюОБоте": "Slack_GetBotInfo",
+"Добавляет новый лист в книгу": "Adds a new sheet to the book",
+"ГВ_ПолучитьСсылкуАвторизации": "GV_GetAuthorizationLink",
+"Получить информацию о канале": "Get channel information",
+"Эти токены обновлять не надо": "These tokens do not need to be updated",
+"JSON массива описаний блоков": "JSON array of block descriptions",
+"Массив соответствий подборок": "Array of selection matches",
+"ПолучитьСтандартныеПараметры": "GetStandardParameters",
+"Загрузить\/Удалить внеш. файл": "Upload\/Delete external file",
+"Получить список внеш. файлов": "Get external file list",
 "ПолучитьСоответствиеКартинки": "GetImageCorrespondence",
-"Получить отложенные сообщения": "Get scheduled messages",
-"Отправить текстовое сообщение": "Send text message",
-"ПараметрыЗапросаВСоответствие": "RequestParametersToMatch",
-"Соответствие Из КлючИЗначение": "Key-Value Pair",
-"URL картинки обложки страницы": "URL of the page cover image",
-"Телеграм_ОтправитьМедиагруппу": "Telegram_SendMediaGroup",
-"Telegram_ОтправитьМеидагруппу": "Telegram_SendMediaGroup",
-"ПолучитьСписокРабочихОбластей": "GetWorkspaceList",
-"Альтернативный текст картинки": "Alternate text of the image",
 "Удаляет внешний файл из Slack": "Deletes an external file from Slack",
+"Ошибка в данных описания поля": "Error in field description data",
+"Альтернативный текст картинки": "Alternate text of the image",
+"ДобавитьВариантСвойстваТовара": "AddProductPropertyVariant",
+"Твиттер_СоздатьТвитСКартинкой": "Twitter_CreateTweetWithImage",
+"Получить отложенные сообщения": "Get scheduled messages",
+"ID блока или сам блок образец": "Block ID or block sample itself",
+"Удаляет ранее созданный товар": "Deletes a previously created product",
+"Соответствие из КлючИЗначение": "Map from KeyAndValue",
 "JSON описание товара или путь": "JSON description of the product or path",
 "Получить данные о базе данных": "Get database information",
-"Соответствие из КлючИЗначение": "Map from KeyAndValue",
-"Закрепить\/Открепить сообщение": "Pin\/Unpin message",
-"Получить онлайн пользователей": "Get online users",
 "ID подборки, если нужен отбор": "Selection ID, if filtering is needed",
-"Проверка_ТелеграмСозданиеТемы": "Check_TelegramCreateTopic",
-"ID блока или сам блок образец": "Block ID or block sample itself",
-"Изменяет существующее событие": "Edits an existing event",
-"Проверка_ДропбоксПространство": "Check_DropboxSpace",
-"СформироватьМассивДанныхЯчеек": "FormCellDataArray",
-"Получить список пользователей": "Get user list",
-"ДобавитьВариантСвойстваТовара": "AddProductPropertyVariant",
-"разрешение на методы Calendar": "Calendar methods permission",
-"Слак_СоздатьАрхивироватьКанал": "Slack_CreateArchiveChannel",
-"ПригласитьПользователейВКанал": "InviteUsersToChannel",
-"app_id из настроек приложения": "app_id from application settings",
+"СлужебныйПрограммныйИнтерфейс": "ServiceProgramInterface",
+"URL картинки обложки страницы": "URL of the page cover image",
 "СоздатьЗаголовокАвторизацииV2": "CreateAuthorizationHeaderV2",
-"Массив соответствий каталогов": "Array of directory mappings",
-"Закрывает существующий диалог": "Closes an existing dialog",
-"Удаляет ранее созданный товар": "Deletes a previously created product",
-"Ноушн_ПолучитьИнформациюОБазе": "Notion_GetDatabaseInfo",
-"Ошибка в данных описания поля": "Error in field description data",
 "Создает твит с видеовложением": "Creates a tweet with a video attachment",
 "Получить статистику по постам": "Get post statistics",
 "Добавить пользователя к файлу": "Add user to file",
-"Твиттер_СоздатьТвитСКартинкой": "Twitter_CreateTweetWithImage",
-"ИзменитьВариантСвойстваТовара": "EditProductPropertyVariant",
+"разрешение на методы Calendar": "Calendar methods permission",
 "СоздатьЗаголовокАвторизацииV1": "CreateAuthorizationHeaderV1",
-"СлужебныйПрограммныйИнтерфейс": "ServiceProgramInterface",
+"СформироватьМассивДанныхЯчеек": "FormCellDataArray",
+"Массив соответствий каталогов": "Array of directory mappings",
 "Отбор по ID каталога родителя": "Filter by parent directory ID",
-"Получает список доступных баз": "Gets the list of available bases",
-"Отправить эфемерное сообщение": "Send ephemeral message",
-"Получить ссылку на скачивание": "Get download link",
+"Получить онлайн пользователей": "Get online users",
+"app_id из настроек приложения": "app_id from application settings",
 "ПолучитьТелоКакДвоичныеДанные": "GetBodyAsBinaryData",
-"Слак_ОтправитьУдалитьЭфемерное": "Slack_SendDeleteEphemeral",
-"СохранитьПубличныйОбъектНаДиск": "SavePublicObjectToDisk",
-"Структура, Массив из Структура": "Structure, Array of Structures",
-"Целевой путь создания каталога": "Target path for creating the directory",
-"Удаляет файл или каталог по ID": "Deletes file or directory by ID",
-"Выгнать пользователя из канала": "Kick user from channel",
-"Размер файла в случае отправке": "File size in case of sending",
-"Получить список версий объекта": "Get list of object versions",
-"ПолучитьСтрокуИзДвоичныхДанных": "GetStringFromBinaryData",
-"Идентификатор записи в таблице": "Record identifier in the table",
-"УстановитьТелоИзДвоичныхДанных": "SetBodyFromBinaryData",
-"ID события календаря источника": "ID of the source calendar event",
-"Идентификатор удаляемого листа": "IdentifierOfSheetToDelete",
-"ПолучитьСписокКатегорийТоваров": "GetProductCategoryList",
-"Путь или набору путей к файлам": "Path or set of paths to the files",
-"ДропБокс_ПолучитьОбновитьТокен": "Dropbox_GetUpdateToken",
-"Получить список опубликованных": "Get published list",
-"Получить список внешних файлов": "Get list of external files",
-"Получить описание файла !NOCLI": "Get file description !NOCLI",
+"Закрывает существующий диалог": "Closes an existing dialog",
+"Получить ссылку на скачивание": "Get download link",
+"ПараметрыЗапросаВСоответствие": "RequestParametersToMatch",
+"Проверка_ДропбоксПространство": "Check_DropboxSpace",
+"Telegram_ОтправитьМеидагруппу": "Telegram_SendMediaGroup",
+"Телеграм_ОтправитьМедиагруппу": "Telegram_SendMediaGroup",
+"Получает список доступных баз": "Gets the list of available bases",
+"Проверка_ТелеграмСозданиеТемы": "Check_TelegramCreateTopic",
+"Соответствие Из КлючИЗначение": "Key-Value Pair",
+"Отправить эфемерное сообщение": "Send ephemeral message",
+"Слак_СоздатьАрхивироватьКанал": "Slack_CreateArchiveChannel",
+"Ноушн_ПолучитьИнформациюОБазе": "Notion_GetDatabaseInfo",
+"ПолучитьСписокРабочихОбластей": "GetWorkspaceList",
+"Отправить текстовое сообщение": "Send text message",
+"ИзменитьВариантСвойстваТовара": "EditProductPropertyVariant",
+"ПригласитьПользователейВКанал": "InviteUsersToChannel",
+"Изменяет существующее событие": "Edits an existing event",
+"Получить список пользователей": "Get user list",
+"Закрепить\/Открепить сообщение": "Pin\/Unpin message",
 "Ноушн_ИзменитьСвойстваСтраницы": "Notion_EditPageProperties",
-"Слак_ОтправитьУдалитьСообщение": "Slack_SendDeleteMessage",
-"СформироватьСтрокуВызоваМетода": "FormMethodCallString",
-"Изменяет ранее созданный товар": "Edits a previously created product",
-"Получить информацию о странице": "Get page info",
 "Создать\/Удалить составной пост": "Create\/Delete composite post",
+"Получить описание файла !NOCLI": "Get file description !NOCLI",
+"ТолстыйКлиентОбычноеПриложение": "ThickClientOrdinaryApplication",
+"JSON описания или путь к .json": "JSON description or path to .json",
+"Идентификатор удаляемого листа": "IdentifierOfSheetToDelete",
+"Слак_ОтправитьУдалитьЭфемерное": "Slack_SendDeleteEphemeral",
+"Слак_ОтправитьУдалитьСообщение": "Slack_SendDeleteMessage",
+"Выгнать пользователя из канала": "Kick user from channel",
+"СформироватьСтрокуВызоваМетода": "FormMethodCallString",
+"ДропБокс_ПолучитьОбновитьТокен": "Dropbox_GetUpdateToken",
+"ПолучитьСтрокуИзДвоичныхДанных": "GetStringFromBinaryData",
+"МаксимальныйУровеньВложенности": "MaximumNestingLevel",
+"ID события календаря источника": "ID of the source calendar event",
+"Получить список опубликованных": "Get published list",
+"УстановитьТелоИзДвоичныхДанных": "SetBodyFromBinaryData",
+"Получить информацию о странице": "Get page info",
+"Удаляет файл или каталог по ID": "Deletes file or directory by ID",
+"ПолучитьСписокКатегорийТоваров": "GetProductCategoryList",
+"Получить ссылку для скачивания": "Get download link",
+"ЯДиск_ПолучитьИнформациюОДиске": "YDisk_GetDiskInfo",
+"Изменяет ранее созданный товар": "Edits a previously created product",
+"СохранитьПубличныйОбъектНаДиск": "SavePublicObjectToDisk",
+"Получить список версий объекта": "Get list of object versions",
+"Получить информацию об объекте": "Get object information",
+"Размер файла в случае отправке": "File size in case of sending",
+"Структура, Массив из Структура": "Structure, Array of Structures",
 "ПолучитьДвоичныеДанныеИзСтроки": "GetBinaryDataFromString",
 "ЗаполнитьПараметрыЗагрузкиФото": "FillPhotoUploadParameters",
-"JSON описания или путь к .json": "JSON description or path to .json",
-"ЯДиск_ПолучитьИнформациюОДиске": "YDisk_GetDiskInfo",
-"Получить ссылку для скачивания": "Get download link",
+"Путь или набору путей к файлам": "Path or set of paths to the files",
+"Получить список внешних файлов": "Get list of external files",
 "УправлениеСостояниемТемыФорума": "ManageForumThreadState",
-"МаксимальныйУровеньВложенности": "MaximumNestingLevel",
-"Получить информацию об объекте": "Get object information",
+"Идентификатор записи в таблице": "Record identifier in the table",
 "Добавить пользователей к папке": "Add users to folder",
-"Нельзя замешивать разные типы!": "Different types cannot be mixed!",
 "Удаляет ранее созданный альбом": "Deletes a previously created album",
-"Получить информацию об аккаунте": "Get account information",
-"Массив из Строка,ДвоичныеДанные": "Array from String, BinaryData",
-"ПолучитьСписокСобытийРекурсивно": "GetEventsListRecursively",
-"только конкретному пользователю": "only to a specific user",
-"Создает пустой каталог на диске": "Creates an empty directory on the drive",
-"Отправка в канал или в чат бота": "Sending to channel or bot chat",
-"Удалить вариант свойства товара": "Delete product property variant",
-"Telegram_ПолучитьИнформациюБота": "Telegram_GetBotInformation",
-"ID чата оригинального сообщения": "Chat ID of the original message",
-"Получает список каталогов диска": "Gets the list of drive directories",
-"Создать ссылку получения токена": "Create token retrieval link",
-"Загружает файл на сервера Slack": "Uploads a file to Slack servers",
-"Проверка_ДропБоксПубличнаяПапка": "Check_DropboxPublicFolder",
-"Создает пустую подборку товаров": "Creates an empty product selection",
-"ПолучитьСписокЗаказовРекурсивно": "GetOrderListRecursively",
-"СформироватьСсылкуПолученияКода": "FormCodeRetrievalLink",
-"Загружает файл на облачный диск": "Uploads a file to the cloud drive",
-"Двоичные данные или пути к фото": "Binary Data or Photo Paths",
-"Удаляет текущего бота из канала": "Removes the current bot from the channel",
-"Добавляет текущего бота в канал": "Adds the current bot to the channel",
-"Создает твит с вложением-гифкой": "Creates a tweet with a gif attachment",
-"VK_СоздатьСсылкуПолученияТокена": "VK_CreateTokenRetrievalLink",
-"Проверка_ДропбоксПубличнаяПапка": "Check_DropboxPublicFolder",
-"Получает информацию об аккаунте": "Gets account information",
-"Целевой путь для нового объекта": "Target path for the new object",
-"Проверка_ТелеграмУдалениеВебхук": "Check_TelegramWebhookDeletion",
-"Телеграм_ИзменитьИмяГлавнойТемы": "Telegram_ChangeMainTopicName",
-"Проверка_ТелеграмИнформацияБота": "Check_TelegramBotInformation",
-"Обновляет двоичные данные файла": "Updates file binary data",
-"Проверка_ТелеграмМестоположение": "Check_TelegramLocation",
-"Dropbox_ОтменитьПубликациюФайла": "Dropbox_CancelFilePublication",
-"Dropbox_ОтменитьПубликациюПапки": "Dropbox_CancelFolderPublication",
-"ПолучитьСписокТоваровРекурсивно": "GetProductListRecursively",
-"ПреобразоватьМножественныйВыбор": "ConvertMultipleChoice",
-"См.ПолучитьСтандартныеПараметры": "See GetStandardParameters",
-"Получить ссылку для авторизации": "Get authorization link",
-"Copyright (c) 2019, ООО 1С-Софт": "Copyright (c) 2019, LLC 1C-Soft",
+"Целевой путь создания каталога": "Target path for creating the directory",
+"Нельзя замешивать разные типы!": "Different types cannot be mixed!",
 "Не удалось записать файл лога!:": "Failed to write log file!:",
-"Функция вернула пустое значение": "Function Returned Empty Value",
-"Получить список аватаров форума": "Get forum avatars list",
-"ПарсерАргументовКоманднойСтроки": "CommandLineArgumentParser",
-"Путь назначение для перемещения": "Destination path for moving",
-"ЯДиск_ДействияПубличныхОбъектов": "YDisk_PublicObjectActions",
-"Двоичные данные или путь к фото": "Binary data or path to photo",
-"Получает значения ячеек таблицы": "Gets cell values of the table",
+"Dropbox_ОтменитьПубликациюПапки": "Dropbox_CancelFolderPublication",
+"Создает твит с вложением-гифкой": "Creates a tweet with a gif attachment",
 "Получить статус загрузки по URL": "Get upload status by URL",
+"Получает значения ячеек таблицы": "Gets cell values of the table",
+"Получает список каталогов диска": "Gets the list of drive directories",
+"Dropbox_ОтменитьПубликациюФайла": "Dropbox_CancelFilePublication",
 "Телеграм_ПолучитьИнформациюБота": "Telegram_GetBotInfo",
+"Telegram_ПолучитьИнформациюБота": "Telegram_GetBotInformation",
+"Функция вернула пустое значение": "Function Returned Empty Value",
+"Телеграм_ИзменитьИмяГлавнойТемы": "Telegram_ChangeMainTopicName",
+"Целевой путь для нового объекта": "Target path for the new object",
+"СформироватьСсылкуПолученияКода": "FormCodeRetrievalLink",
+"Массив из Строка,ДвоичныеДанные": "Array from String, BinaryData",
+"Получить список аватаров форума": "Get forum avatars list",
+"Проверка_ТелеграмУдалениеВебхук": "Check_TelegramWebhookDeletion",
+"ПолучитьСписокЗаказовРекурсивно": "GetOrderListRecursively",
+"Удалить вариант свойства товара": "Delete product property variant",
+"ПреобразоватьМножественныйВыбор": "ConvertMultipleChoice",
+"Создает пустую подборку товаров": "Creates an empty product selection",
 "Получить список иконок-аватаров": "Get avatar icon list",
 "Действия с публичными объектами": "Actions with public objects",
-"Массив ячеек вида А1 для очистки": "Array of cells like A1 to be cleared",
-"Получает список подборок товаров": "Gets the list of product selections",
-"Слак_ПолучитьОтложенныеСообщения": "Slack_GetScheduledMessages",
-"Количество возвращаемых объектов": "Number of returned objects",
-"См.ДобавитьВариантСвойстваТовара": "See AddPropertyVariant",
-"ПолучитьСписокОтветовНаСообщение": "GetMessageReplyList",
+"Получить информацию об аккаунте": "Get account information",
+"Получает информацию об аккаунте": "Gets account information",
+"Двоичные данные или пути к фото": "Binary Data or Photo Paths",
+"Двоичные данные или путь к фото": "Binary data or path to photo",
+"только конкретному пользователю": "only to a specific user",
+"Проверка_ДропбоксПубличнаяПапка": "Check_DropboxPublicFolder",
+"Получить ссылку для авторизации": "Get authorization link",
+"См.ПолучитьСтандартныеПараметры": "See GetStandardParameters",
+"ПолучитьСписокСобытийРекурсивно": "GetEventsListRecursively",
+"Путь назначение для перемещения": "Destination path for moving",
+"Загружает файл на облачный диск": "Uploads a file to the cloud drive",
+"ПолучитьСписокТоваровРекурсивно": "GetProductListRecursively",
+"Проверка_ТелеграмМестоположение": "Check_TelegramLocation",
+"VK_СоздатьСсылкуПолученияТокена": "VK_CreateTokenRetrievalLink",
+"ID чата оригинального сообщения": "Chat ID of the original message",
+"Проверка_ТелеграмИнформацияБота": "Check_TelegramBotInformation",
+"Добавляет текущего бота в канал": "Adds the current bot to the channel",
+"Проверка_ДропБоксПубличнаяПапка": "Check_DropboxPublicFolder",
+"ЯДиск_ДействияПубличныхОбъектов": "YDisk_PublicObjectActions",
+"ПарсерАргументовКоманднойСтроки": "CommandLineArgumentParser",
+"Создать ссылку получения токена": "Create token retrieval link",
+"Copyright (c) 2019, ООО 1С-Софт": "Copyright (c) 2019, LLC 1C-Soft",
+"Создает пустой каталог на диске": "Creates an empty directory on the drive",
+"Загружает файл на сервера Slack": "Uploads a file to Slack servers",
+"Удаляет текущего бота из канала": "Removes the current bot from the channel",
+"Обновляет двоичные данные файла": "Updates file binary data",
+"Отправка в канал или в чат бота": "Sending to channel or bot chat",
 "Получить описание товара. !NOCLI": "Get product description. !NOCLI",
-"Получить описание события !NOCLI": "Get event description !NOCLI",
-"ПриостановитьРекламноеОбъявление": "PauseAdvertisingAd",
-"Отправка в канал или чат с ботом": "Sending to channel or bot chat",
-"Идентификатор изменяемого товара": "Identifier of the product being edited",
 "Создает страницу в базе-родителе": "Creates a page in the parent database",
-"ВыполнитьЗапросСДвоичнымиДанными": "ExecuteRequestWithBinaryData",
-"ПолучитьСписокРекламныхКатегорий": "GetAdvertisingCategoryList",
+"ОпределитьМетодУправленияФорумом": "DetermineForumManagementMethod",
+"ПриостановитьРекламноеОбъявление": "PauseAdvertisingAd",
+"Массив ячеек вида А1 для очистки": "Array of cells like A1 to be cleared",
 "Получить список рабочих областей": "Get workspace list",
+"ДобавитьДополнительныеФотоТовара": "AddAdditionalProductPhotos",
+"Получает список подборок товаров": "Gets the list of product selections",
+"Отправляет гифку в чат или канал": "Sends a GIF to a chat or channel",
 "Удаляет объект с облачного диска": "Deletes an object from the cloud drive",
-"Путь к удаляемой папке или файлу": "Path to the folder or file to be deleted",
-"Удаляет объект по заданному пути": "Deletes an object at the specified path",
-"Обновляет токен по Refresh token": "Updates token by Refresh token",
-"Проверка_ТелеграмУстановкаВебхук": "Check_TelegramWebhookSetup",
-"Закрывает или удаляет обсуждение": "Close or delete discussion",
-"Слак_ПолучитьСписокПользователей": "Slack_GetUserList",
-"Изменяет имя главной темы форума": "Edits the name of the main forum thread",
-"Изменить вариант свойства товара": "Edit product property variant",
-"Идентификатор файла или каталога": "Identifier of the file or folder",
-"Добавить вариант свойства товара": "Add product property variant",
-"ЯДиск_ПолучитьСсылкуНаСкачивание": "YDisk_GetDownloadLink",
 "Вайбер_ПолучитьИнформациюОКанале": "Viber_GetChannelInfo",
+"Количество возвращаемых объектов": "Number of returned objects",
+"ПолучитьСписокАльбомовРекурсивно": "GetAlbumListRecursively",
+"ПолучитьСписокОтветовНаСообщение": "GetMessageReplyList",
+"Обновляет токен по Refresh token": "Updates token by Refresh token",
+"См.ДобавитьВариантСвойстваТовара": "See AddPropertyVariant",
 "Получает описание поля типа дата": "Gets the description of a date field",
-"Изменить имя главной темы форума": "Edit main forum thread name",
+"Массив из Строка, ДвоичныеДанные": "Array from String, BinaryData",
+"Загрузить массив вложений !NOCLI": "Upload attachments array !NOCLI",
+"Удаляет объект по заданному пути": "Deletes an object at the specified path",
+"Путь к удаляемой папке или файлу": "Path to the folder or file to be deleted",
+"ВыполнитьЗапросСДвоичнымиДанными": "ExecuteRequestWithBinaryData",
+"Идентификатор файла или каталога": "Identifier of the file or folder",
+"ЯДиск_ПолучитьСсылкуНаСкачивание": "YDisk_GetDownloadLink",
 "Телеграм_ОтправитьМестоположение": "Telegram_SendLocation",
-"Telegram_ОтправитьМестоположение": "Telegram_SendLocation",
+"Изменяет имя главной темы форума": "Edits the name of the main forum thread",
+"JSON клавиатуры или путь к .json": "Keyboard JSON or path to .json",
+"Ошибка в данных коллекции таблиц": "Error in table collection data",
+"См. ПолучитьСписокИконокАватаров": "See GetAvatarIconList",
 "ПолучитьСписокОбъектовРекурсивно": "GetObjectsListRecursively",
 "Отправляет видео в чат или канал": "Sends a video to a chat or channel",
-"JSON клавиатуры или путь к .json": "Keyboard JSON or path to .json",
-"Телеграм_ПолучитьЧислоУчастников": "Telegram_GetMemberCount",
-"Telegram_ПолучитьЧислоУчастников": "Telegram_GetParticipantCount",
-"Telegram_СкрытьГлавнуюТемуФорума": "Telegram_HideMainForumTopic",
-"Отправляет гифку в чат или канал": "Sends a GIF to a chat or channel",
-"Ошибка в данных коллекции таблиц": "Error in table collection data",
-"ОпределитьМетодУправленияФорумом": "DetermineForumManagementMethod",
-"ДобавитьДополнительныеФотоТовара": "AddAdditionalProductPhotos",
-"Пригласить пользователей в канал": "Invite users to channel",
-"Массив из Строка, ДвоичныеДанные": "Array from String, BinaryData",
+"Проверка_ТелеграмУстановкаВебхук": "Check_TelegramWebhookSetup",
+"Изменить вариант свойства товара": "Edit product property variant",
 "Ноушн_ПолучитьДанныеПользователя": "Notion_GetUserData",
-"Загрузить массив вложений !NOCLI": "Upload attachments array !NOCLI",
-"ПолучитьСписокАльбомовРекурсивно": "GetAlbumListRecursively",
-"См. ПолучитьСписокИконокАватаров": "See GetAvatarIconList",
-"Открепляет сообщение в шапке чата": "Unpins a message in the chat header",
-"Создает опрос с вариантами ответа": "Creates a poll with answer options",
-"Dropbox_ВосстановитьОбъектКВерсии": "Dropbox_RestoreObjectToVersion",
-"Получить список категорий товаров": "Get a list of product categories",
-"Запрос, приходящий на http-сервис": "Request coming to the http service",
-"Телеграм_СоздатьСсылкуПриглашение": "Telegram_CreateInvitationLink",
-"Telegram_СоздатьСсылкуПриглашение": "Telegram_CreateInviteLink",
-"Dropbox_ПолучитьСписокФайловПапки": "Dropbox_GetFolderFileList",
-"ПолучитьСписокПользователейКанала": "GetChannelUserList",
-"ПолучитьHexСтрокуИзДвоичныхДанных": "GetHexStringFromBinaryData",
-"Телеграм_СоздатьУдалитьТемуФорума": "Telegram_CreateDeleteForumTopic",
-"сериализованный JSON ответа от VK": "Serialized JSON response from VK",
-"JSON авторизации или путь к .json": "Authorization JSON or path to .json",
-"Dropbox_ПолучитьСсылкуАвторизации": "Dropbox_GetAuthorizationLink",
-"РежимВосстановленияПутейФайловZIP": "ZIPFilePathRecoveryMode",
-"Закрепляет сообщение в шапке чата": "Pins a message in the chat header",
-"Скачивает файл по указанному пути": "Downloads a file at the specified path",
-"ПолучитьСписокОтложенныхСообщений": "GetDelayedMessageList",
-"v1.1. Поэтому что-то нужно делать": "v1.1. Therefore, something needs to be done",
-"Ссылка на страницу сайта магазина": "Link to the store's website page",
-"ПолучитьДвоичныеДанныеИзHexСтроки": "GetBinaryDataFromHexString",
-"Ноушн_ПолучитьИнформациюОСтранице": "Notion_GetPageInfo",
-"ПолучитьСоответствиеКомандМодулей": "GetCommandModuleMapping",
-"Получает информацию о книге по ID": "Gets information about the book by ID",
-"ВыполнитьЗапросМультипартРелэйтед": "ExecuteMultipartRelatedRequest",
-"Получает список доступных каналов": "Gets a list of available channels",
-"Путь помещения загруженного файла": "Path to place the downloaded file",
-"Предпочтительное хранение токенов": "Preferred token storage",
+"Добавить вариант свойства товара": "Add product property variant",
+"Слак_ПолучитьСписокПользователей": "Slack_GetUserList",
+"Telegram_СкрытьГлавнуюТемуФорума": "Telegram_HideMainForumTopic",
+"Telegram_ОтправитьМестоположение": "Telegram_SendLocation",
+"ПолучитьСписокРекламныхКатегорий": "GetAdvertisingCategoryList",
+"Отправка в канал или чат с ботом": "Sending to channel or bot chat",
+"Получить описание события !NOCLI": "Get event description !NOCLI",
+"Идентификатор изменяемого товара": "Identifier of the product being edited",
+"Закрывает или удаляет обсуждение": "Close or delete discussion",
+"Пригласить пользователей в канал": "Invite users to channel",
+"Telegram_ПолучитьЧислоУчастников": "Telegram_GetParticipantCount",
+"Слак_ПолучитьОтложенныеСообщения": "Slack_GetScheduledMessages",
+"Телеграм_ПолучитьЧислоУчастников": "Telegram_GetMemberCount",
+"Изменить имя главной темы форума": "Edit main forum thread name",
 "Твиттер_ПолучитьСсылкуАвторизации": "Twitter_GetAuthorizationLink",
+"ПолучитьДвоичныеДанныеИзHexСтроки": "GetBinaryDataFromHexString",
+"ПолучитьСоответствиеКомандМодулей": "GetCommandModuleMapping",
+"Запрос, приходящий на http-сервис": "Request coming to the http service",
+"Предпочтительное хранение токенов": "Preferred token storage",
+"Скачивает файл по указанному пути": "Downloads a file at the specified path",
+"РежимВосстановленияПутейФайловZIP": "ZIPFilePathRecoveryMode",
+"JSON авторизации или путь к .json": "Authorization JSON or path to .json",
+"Dropbox_ПолучитьСписокФайловПапки": "Dropbox_GetFolderFileList",
+"Путь помещения загруженного файла": "Path to place the downloaded file",
+"сериализованный JSON ответа от VK": "Serialized JSON response from VK",
+"ПолучитьСписокОтложенныхСообщений": "GetDelayedMessageList",
+"Ноушн_ПолучитьИнформациюОСтранице": "Notion_GetPageInfo",
+"Получить список категорий товаров": "Get a list of product categories",
+"Telegram_СоздатьСсылкуПриглашение": "Telegram_CreateInviteLink",
+"Получает информацию о книге по ID": "Gets information about the book by ID",
+"Dropbox_ВосстановитьОбъектКВерсии": "Dropbox_RestoreObjectToVersion",
+"Телеграм_СоздатьСсылкуПриглашение": "Telegram_CreateInvitationLink",
+"ПолучитьHexСтрокуИзДвоичныхДанных": "GetHexStringFromBinaryData",
+"v1.1. Поэтому что-то нужно делать": "v1.1. Therefore, something needs to be done",
+"Закрепляет сообщение в шапке чата": "Pins a message in the chat header",
+"Создает опрос с вариантами ответа": "Creates a poll with answer options",
+"Открепляет сообщение в шапке чата": "Unpins a message in the chat header",
 "Вайбер_ПолучитьДанныеПользователя": "Viber_GetUserData",
-"Путь для сохранение файла на Диске": "Path for saving the file to disk",
-"Вайбер_ОтправитьТекстовоеСообщение": "Viber_SendTextMessage",
-"querry из Telegram.WebApp.initData": "Query from Telegram.WebApp.initData",
-"Сохранить публичный объект на диск": "Save public object to disk",
-"Телеграм_СкрытьПоказатьГлавнуюТему": "Telegram_HideShowMainTopic",
-"СформироватьПараметрыЗагрузкиФайла": "FormFileUploadParameters",
-"Telegram_ПоказатьГлавнуюТемуФорума": "Telegram_ShowMainForumTopic",
-"Получает описание поля типа булево": "Gets the description of a boolean field",
-"Сформировать ссылку получения кода": "Generate code retrieval link",
-"ЗаписатьПобитовоеИсключительноеИли": "WriteBitwiseExclusiveOr",
-"Получает данные пользователя по ID": "Gets user data by ID",
-"ДобавитьИменованныйПараметрКоманды": "AddNamedCommandParameter",
-"ID целевого чата или IDЧата*IDТемы": "Target chat ID or ChatID*TopicID",
-"ОпределитьМетодЗагрузкиИзображений": "DetermineImageUploadMethod",
-"Идентификатор обновляемого объекта": "Identifier of the object to update",
-"Текст лицензии доступен по ссылке:": "License text available at:",
-"ЯДиск_ПолучитьСписокОпубликованных": "YDisk_GetPublishedList",
-"ДобавитьПозиционныйПараметрКоманды": "AddPositionalCommandParameter",
-"Соответствие изменяемых параметров": "Matching of editable parameters",
-"Вайбер_ПолучитьОнлайнПользователей": "Viber_GetOnlineUsers",
-"ОбработатьДанные Telegram Mini App": "Process Telegram Mini App data",
-"Закрывает тему для новых сообщений": "Closes the thread for new messages",
-"ПолучитьСписокКалендарейРекурсивно": "GetCalendarsListRecursively",
-"См. ПолучитьСписокКатегорийТоваров": "See GetProductCategoryList",
-"Устанавливает значения ячеек листа": "Sets sheet cell values",
-"Временная отметка или ID сообщения": "Timestamp or message ID",
-"Получает список товаров сообщества": "Gets the community's product list",
-"ДропБокс_ПолучитьСписокФайловПапки": "Dropbox_GetFolderFileList",
-"Приостановить рекламное объявление": "Pause advertising post",
+"Получает список доступных каналов": "Gets a list of available channels",
+"Dropbox_ПолучитьСсылкуАвторизации": "Dropbox_GetAuthorizationLink",
+"ВыполнитьЗапросМультипартРелэйтед": "ExecuteMultipartRelatedRequest",
+"Ссылка на страницу сайта магазина": "Link to the store's website page",
+"ПолучитьСписокПользователейКанала": "GetChannelUserList",
+"Телеграм_СоздатьУдалитьТемуФорума": "Telegram_CreateDeleteForumTopic",
 "Изменяет свойства подборки товаров": "Edits the properties of a product selection",
 "Идентификатор объекта для удаления": "Identifier of the object to delete",
-"Скачивает файл с серверов Telegram": "Download file from Telegram servers",
-"что обсуловлено наличием сразу 2-х": "which is due to the presence of two at once",
-"Создает твит с картинкой вложением": "Creates a tweet with an image attachment",
-"Массив данных статистики по постам": "Array of post statistics data",
+"Получает список товаров сообщества": "Gets the community's product list",
+"Закрывает тему для новых сообщений": "Closes the thread for new messages",
+"Получает данные пользователя по ID": "Gets user data by ID",
+"СформироватьПараметрыЗагрузкиФайла": "FormFileUploadParameters",
+"ТолстыйКлиентУправляемоеПриложение": "ThickClientManagedApplication",
+"ЗаписатьПобитовоеИсключительноеИли": "WriteBitwiseExclusiveOr",
+"Вайбер_ПолучитьОнлайнПользователей": "Viber_GetOnlineUsers",
+"Путь для сохранение файла на Диске": "Path for saving the file to disk",
+"Временная отметка или ID сообщения": "Timestamp or message ID",
+"Текст лицензии доступен по ссылке:": "License text available at:",
+"Идентификатор обновляемого объекта": "Identifier of the object to update",
 "Расширение файла в случае отправки": "File extension in case of sending",
-"Получает информацию о внешнем файле": "Gets information about the external file",
-"Получает массив календарей аккаунта": "Gets an array of account calendars",
-"Наименование создаваемого календаря": "Name of the created calendar",
-"Dropbox_ДобавитьПользователейКПапке": "Dropbox_AddUsersToFolder",
-"Создает сокращенный URL из обычного": "Creates a shortened URL from a regular one",
+"См. ПолучитьСписокКатегорийТоваров": "See GetProductCategoryList",
+"Вайбер_ОтправитьТекстовоеСообщение": "Viber_SendTextMessage",
+"ЯДиск_ПолучитьСписокОпубликованных": "YDisk_GetPublishedList",
+"ID целевого чата или IDЧата*IDТемы": "Target chat ID or ChatID*TopicID",
+"Сохранить публичный объект на диск": "Save public object to disk",
+"querry из Telegram.WebApp.initData": "Query from Telegram.WebApp.initData",
+"Сформировать ссылку получения кода": "Generate code retrieval link",
+"ДропБокс_ПолучитьСписокФайловПапки": "Dropbox_GetFolderFileList",
+"ДобавитьИменованныйПараметрКоманды": "AddNamedCommandParameter",
+"Приостановить рекламное объявление": "Pause advertising post",
+"Получает описание поля типа булево": "Gets the description of a boolean field",
+"ПолучитьСписокКалендарейРекурсивно": "GetCalendarsListRecursively",
+"ОбработатьДанные Telegram Mini App": "Process Telegram Mini App data",
+"Создает твит с картинкой вложением": "Creates a tweet with an image attachment",
+"что обсуловлено наличием сразу 2-х": "which is due to the presence of two at once",
+"Соответствие изменяемых параметров": "Matching of editable parameters",
+"ОпределитьМетодЗагрузкиИзображений": "DetermineImageUploadMethod",
+"Телеграм_СкрытьПоказатьГлавнуюТему": "Telegram_HideShowMainTopic",
+"Telegram_ПоказатьГлавнуюТемуФорума": "Telegram_ShowMainForumTopic",
+"Скачивает файл с серверов Telegram": "Download file from Telegram servers",
+"Массив данных статистики по постам": "Array of post statistics data",
+"ДобавитьПозиционныйПараметрКоманды": "AddPositionalCommandParameter",
+"Устанавливает значения ячеек листа": "Sets sheet cell values",
+"Получает информацию о текущем диске": "Gets information about the current disk",
 "ПолучитьСтатусАсинхронногоИзменения": "GetAsynchronousChangeStatus",
-"Получает информацию событиях канала": "Gets information about channel events",
-"Строка,Число,Массив из Строка,Число": "String,Number,Array of String,Number",
-"Изменяет свойства существующей базы": "Edits properties of an existing database",
-"ПолучитьБуферДвоичныхДанныхИзСтроки": "GetBinaryDataBufferFromString",
+"Создает сокращенный URL из обычного": "Creates a shortened URL from a regular one",
+"Идентификатор рабочего пространства": "Workspace identifier",
+"Отправляет документ в чат или канал": "Sends a document to a chat or channel",
+"Получает основную информацию о боте": "Gets basic information about the bot",
 "Банит пользователя в выбранном чате": "Bans a user in the selected chat",
-"Получить список рекламных категорий": "Get a list of advertising categories",
+"Открывает ранее закрытое обсуждение": "Opens a previously closed discussion",
+"Получает информацию событиях канала": "Gets information about channel events",
+"Отправляет картинку в чат или канал": "Sends an image to a chat or channel",
+"Получает массив календарей аккаунта": "Gets an array of account calendars",
+"Получает информацию о внешнем файле": "Gets information about the external file",
 "ID темы. Главная, если не заполнено": "Thread ID. Main if not filled",
 "Типы: audio, document, photo, video": "Types: audio, document, photo, video",
-"Dropbox_ДобавитьПользователейКФайлу": "Dropbox_AddUsersToFile",
-"Dropbox_ПолучитьСтатусЗагрузкиПоURL": "Dropbox_GetUploadStatusByURL",
-"Открывает ранее закрытое обсуждение": "Opens a previously closed discussion",
-"Получает основную информацию о боте": "Gets basic information about the bot",
-"Отправляет картинку в чат или канал": "Sends an image to a chat or channel",
-"Идентификатор рабочего пространства": "Workspace identifier",
-"Dropbox_ПолучитьСписокВерсийОбъекта": "Dropbox_GetObjectVersionList",
-"Получает информацию о текущем диске": "Gets information about the current disk",
 "Dropbox_ПолучитьИнформациюОбОбъекте": "Dropbox_GetObjectInformation",
+"Dropbox_ПолучитьСписокВерсийОбъекта": "Dropbox_GetObjectVersionList",
+"Получить список рекламных категорий": "Get a list of advertising categories",
+"Изменяет свойства существующей базы": "Edits properties of an existing database",
+"Dropbox_ДобавитьПользователейКПапке": "Dropbox_AddUsersToFolder",
+"ПолучитьБуферДвоичныхДанныхИзСтроки": "GetBinaryDataBufferFromString",
+"Dropbox_ДобавитьПользователейКФайлу": "Dropbox_AddUsersToFile",
+"Строка,Число,Массив из Строка,Число": "String,Number,Array of String,Number",
 "ID родительского блока или страницы": "Parent block or page ID",
-"Отправляет документ в чат или канал": "Sends a document to a chat or channel",
-"Главный в группе, если есть в группе": "Main in the group, if exists in the group",
-"Получает статистику в разрезе постов": "Gets statistics in terms of posts",
-"Получить список ответов на сообщение": "Get list of message replies",
+"Наименование создаваемого календаря": "Name of the created calendar",
+"Dropbox_ПолучитьСтатусЗагрузкиПоURL": "Dropbox_GetUploadStatusByURL",
+"Возвращает список заказов сообщества": "Returns the community's order list",
+"Telegram_ОтправитьТекстовоеСообщение": "Telegram_SendTextMessage",
+"Отправляет аудиофайл в чат или канал": "Sends an audio file to a chat or channel",
+"ПолучитьСоответствиеПараметровТовара": "GetProductParameterMapping",
+"Путь к оригинальному файлу или папке": "Path to the original file or folder",
+"Dropbox_ПолучитьИнформациюОбАккаунте": "Dropbox_GetAccountInformation",
+"Результат чтения JSON ответа сервера": "Result of reading the JSON response from the server",
+"Удаляет существующее свойство товара": "Deletes the existing product property",
+"Создает альбом для хранения картинок": "Creates an album to store images",
+"ПолучитьСписокОпубликованныхОбъектов": "GetPublishedObjectsList",
+"Перемещает объект по выбранному пути": "Moves an object to the selected path",
 "Телеграм_ЗакрепитьОткрепитьСообщение": "Telegram_PinUnpinMessage",
 "Получает общее число участников чата": "Gets the total number of chat participants",
-"Устанавливает цель (описание) канала": "Sets the channel purpose (description)",
-"Возвращает список заказов сообщества": "Returns the community's order list",
-"Получает ссылку для скачивания файла": "Gets a download link for the file",
-"Создает альбом для хранения картинок": "Creates an album to store images",
-"Получить список пользователей канала": "Get channel user list",
-"сериализованный JSON ответа от Viber": "serialized JSON response from Viber",
-"Перемещает объект по выбранному пути": "Moves an object to the selected path",
-"Dropbox_ПолучитьИнформациюОбАккаунте": "Dropbox_GetAccountInformation",
-"Удаляет комментарий к записи таблицы": "Deletes a comment for a table record",
-"Отправляет опрос с вариантами ответа": "Sends a poll with answer options",
-"Удаляет существующее свойство товара": "Deletes the existing product property",
-"Отправляет сообщение в выбранный час": "Sends a message at a selected hour",
-"Строка,Соответствие Из КлючИЗначение": "String, Map From KeyAndValue",
-"Отправляет аудиофайл в чат или канал": "Sends an audio file to a chat or channel",
-"Путь к оригинальному файлу или папке": "Path to the original file or folder",
-"сериализованный JSON ответа от Slack": "Serialized JSON response from Slack",
-"Telegram_ОтправитьТекстовоеСообщение": "Telegram_SendTextMessage",
-"Путь к опубликованному ранее объекту": "Path to the previously published object",
-"ПолучитьСоответствиеПараметровТовара": "GetProductParameterMapping",
-"Результат чтения JSON ответа сервера": "Result of reading the JSON response from the server",
 "Телеграм_ОтправитьТекстовоеСообщение": "Telegram_SendTextMessage",
-"Получает информацию о странице по ID": "Gets information about the page by ID",
+"Удаляет комментарий к записи таблицы": "Deletes a comment for a table record",
+"Получает статистику в разрезе постов": "Gets statistics in terms of posts",
+"Получить список ответов на сообщение": "Get list of message replies",
+"Главный в группе, если есть в группе": "Main in the group, if exists in the group",
+"Отправляет сообщение в выбранный час": "Sends a message at a selected hour",
 "Получить список отложенных сообщений": "Get list of delayed messages",
-"ПолучитьСписокОпубликованныхОбъектов": "GetPublishedObjectsList",
-"ПреобразоватьДанныеСПолучениемРазмера": "ConvertDataWithSizeRetrieval",
-"Получает описание поля файлового типа": "Gets the description of a file field",
-"Массив соответствий данных календарей": "Array of calendar data mappings",
-"Получает описание поля числового типа": "Gets the description of a numeric field",
-"Перемещает событие в другой календарь": "Moves an event to another calendar",
-"Копирует лист из одной книги в другую": "Copies a sheet from one book to another",
-"ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект": "YDisk_UploadByUrlAndGetObject",
+"Отправляет опрос с вариантами ответа": "Sends a poll with answer options",
+"Путь к опубликованному ранее объекту": "Path to the previously published object",
+"Получить список пользователей канала": "Get channel user list",
+"Получает информацию о странице по ID": "Gets information about the page by ID",
+"Устанавливает цель (описание) канала": "Sets the channel purpose (description)",
+"сериализованный JSON ответа от Slack": "Serialized JSON response from Slack",
+"Получает ссылку для скачивания файла": "Gets a download link for the file",
+"Строка,Соответствие Из КлючИЗначение": "String, Map From KeyAndValue",
+"сериализованный JSON ответа от Viber": "serialized JSON response from Viber",
 "сериализованный JSON ответа от Notion": "Serialized JSON response from Notion",
-"Изменяет существующее свойство товара": "Edits the existing product property",
-"ID свойства, куда добавляется вариант": "Property ID where the variant is added",
-"СформироватьКлавиатуруИзМассиваКнопок": "CreateKeyboardFromArrayButton",
-"сериализованный JSON ответа от Yandex": "serialized JSON response from Yandex",
-"Получает статус загрузки файла по URL": "Gets the upload status of the file by URL",
-"ID версии (ревизии) для востановления": "ID of the version (revision) for restoration",
-"Телеграм_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarsList",
-"Telegram_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarList",
-"Telegram_ИзменитьИмяГлавнойТемыФорума": "Telegram_ChangeMainTopicName",
-"УправлениеВидимостьюГлавнойТемыФорума": "ManageMainTopicVisibility",
-"СформироватьКлавиатуруПоМассивуКнопок": "FormKeyboardFromButtonArray",
-"Для отображения скидки\/изменения цены": "For displaying discount\/changing price",
-"сериализованный JSON ответа от Google": "serialized JSON response from Google",
-"Получает информацию о календаре по ID": "Gets calendar information by ID",
-"Удаляет сообщение канала по timestamp": "Deletes a channel message by timestamp",
 "Пример структуры\/соответствия свойств": "Example structure\/property map",
-"Признак удаления отложенного сообщения": "Indicator of deleting a delayed message",
-"Формирует клавиатуру по массиву кнопок": "Forms a keyboard from an array of buttons",
-"Получает описание поля строкового типа": "Gets the description of a string field",
-"Сохраняет картинку в альбом сообщества": "Saves an image to the community album",
-"Получить статус асинхронного изменения": "Get asynchronous change status",
+"Перемещает событие в другой календарь": "Moves an event to another calendar",
+"Получает статус загрузки файла по URL": "Gets the upload status of the file by URL",
+"ID свойства, куда добавляется вариант": "Property ID where the variant is added",
+"Для отображения скидки\/изменения цены": "For displaying discount\/changing price",
+"Копирует лист из одной книги в другую": "Copies a sheet from one book to another",
+"Изменяет существующее свойство товара": "Edits the existing product property",
+"УправлениеВидимостьюГлавнойТемыФорума": "ManageMainTopicVisibility",
+"ID версии (ревизии) для востановления": "ID of the version (revision) for restoration",
+"ПреобразоватьДанныеСПолучениемРазмера": "ConvertDataWithSizeRetrieval",
+"СформироватьКлавиатуруИзМассиваКнопок": "CreateKeyboardFromArrayButton",
+"Получает информацию о календаре по ID": "Gets calendar information by ID",
+"сериализованный JSON ответа от Yandex": "serialized JSON response from Yandex",
+"Telegram_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarList",
+"Получает описание поля числового типа": "Gets the description of a numeric field",
+"Telegram_ИзменитьИмяГлавнойТемыФорума": "Telegram_ChangeMainTopicName",
+"Получает описание поля файлового типа": "Gets the description of a file field",
+"Телеграм_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarsList",
+"СформироватьКлавиатуруПоМассивуКнопок": "FormKeyboardFromButtonArray",
+"ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект": "YDisk_UploadByUrlAndGetObject",
+"сериализованный JSON ответа от Google": "serialized JSON response from Google",
+"Массив соответствий данных календарей": "Array of calendar data mappings",
+"Удаляет сообщение канала по timestamp": "Deletes a channel message by timestamp",
+"Получить список подборок по массиву ID": "Gets the list of selections by array of IDs",
+"Получает список всех событий календаря": "Gets the list of all calendar events",
 "Некорректный статус управления форумом": "Incorrect forum management status",
-"Создает комментарий к записи в таблице": "Creates a comment for a record in the table",
-"Удалить полностью (Истина) или закрыть": "Delete completely (True) or close",
-"Получает список свойств товаров группы": "Gets the list of properties of group products",
+"ПолучитьБуферДвоичныхДанныхИзHexСтроки": "GetBinaryDataBufferFromHexString",
+"Получает описание поля строкового типа": "Gets the description of a string field",
+"Получает список файлов бота или канала": "Gets a list of files of the bot or channel",
 "Сохраняет публичный объект на ваш диск": "Saves the public object to your disk",
 "Получает список тегов выбранных файлов": "Gets the list of tags of the selected files",
 "сериализованный JSON ответа от Dropbox": "serialized JSON response from Dropbox",
-"Получает список файлов бота или канала": "Gets a list of files of the bot or channel",
-"Получить список подборок по массиву ID": "Gets the list of selections by array of IDs",
-"Получает список всех событий календаря": "Gets the list of all calendar events",
-"ПолучитьБуферДвоичныхДанныхИзHexСтроки": "GetBinaryDataBufferFromHexString",
-"сериализованный JSON ответа от Twitter": "serialized JSON response from Twitter",
+"Сохраняет картинку в альбом сообщества": "Saves an image to the community album",
 "Смещение в списке получаемых сообщений": "Offset in the list of received messages",
-"Дата отправки для отложенного сообщения": "Sending date for delayed message",
-"ОчиститьСписокЗакрепленныхСообщенийТемы": "ClearThreadPinnedMessagesList",
-"Получает список опубликованных объектов": "Gets a list of published objects",
-"Перезаписывать файл при конфликте путей": "Overwrite file in case of path conflicts",
+"сериализованный JSON ответа от Twitter": "serialized JSON response from Twitter",
+"Создает комментарий к записи в таблице": "Creates a comment for a record in the table",
+"Признак удаления отложенного сообщения": "Indicator of deleting a delayed message",
+"Получить статус асинхронного изменения": "Get asynchronous change status",
+"Удалить полностью (Истина) или закрыть": "Delete completely (True) or close",
+"Получает список свойств товаров группы": "Gets the list of properties of group products",
+"Формирует клавиатуру по массиву кнопок": "Forms a keyboard from an array of buttons",
 "Изменяет состав существующего сообщения": "Edits the content of an existing message",
-"HTTPОтвет, Произвольный, ДвоичныеДанные": "HTTPResponse, Arbitrary, BinaryData",
-"ПолучитьДанныеИспользованияПространства": "GetSpaceUsageData",
-"сериализованный JSON ответа от Airtable": "serialized JSON response from Airtable",
+"Дата отправки для отложенного сообщения": "Sending date for delayed message",
 "ID существующей группы, если необходимо": "ID of the existing group, if needed",
-"Путь к оригинальному файлу или каталогу": "Path to the original file or directory",
 "сериализованный JSON ответа от Telegram": "Serialized JSON response from Telegram",
-"Удаляет календарь из списка пользователя": "Removes a calendar from the user's list",
-"Создает комментарий к файлу или каталогу": "Creates a comment for a file or directory",
-"Массив вариантов опроса, если необходимо": "Array of poll options, if necessary",
-"Удаляет текстовый тег файла или каталога": "Deletes the text tag of a file or directory",
-"Изменяет текст существующего комментария": "Changes the text of an existing comment",
-"Удаляет ранее созданный вариант свойства": "Deletes the previously created product property variant",
-"Добавляет список файлов к полям каталога": "Adds a list of files to the directory fields",
+"ПолучитьДанныеИспользованияПространства": "GetSpaceUsageData",
+"HTTPОтвет, Произвольный, ДвоичныеДанные": "HTTPResponse, Arbitrary, BinaryData",
+"ОчиститьСписокЗакрепленныхСообщенийТемы": "ClearThreadPinnedMessagesList",
+"Путь к оригинальному файлу или каталогу": "Path to the original file or directory",
+"Перезаписывать файл при конфликте путей": "Overwrite file in case of path conflicts",
+"сериализованный JSON ответа от Airtable": "serialized JSON response from Airtable",
+"Получает список опубликованных объектов": "Gets a list of published objects",
 "Массив идентификаторов вида photo123_123": "Array of identifiers like photo123_123",
-"Получает информацию о пользователе по ID": "Gets user information by ID",
-"Загружает файл на диск по заданному пути": "Uploads a file to disk at the specified path",
+"Массив вариантов опроса, если необходимо": "Array of poll options, if necessary",
 "Скачивает файл по указанному пути или ID": "Downloads a file by the specified path or ID",
-"Получает информацию о файле или каталоге": "Gets information about a file or directory",
-"Получает список версий (ревизий) объекта": "Gets the list of versions (revisions) of the object",
 "Изменяет наименование существующей книги": "Changes the name of the existing book",
+"Удаляет календарь из списка пользователя": "Removes a calendar from the user's list",
+"Получает информацию о файле или каталоге": "Gets information about a file or directory",
 "ПолучитьСоответствиеРазделовТестирования": "GetTestingSectionMapping",
-"ОбработкаВходящегоЗапросаПослеАвторизации": "HandleIncomingRequestAfterAuthorization",
-"действия будут выполняться от лица группы": "actions will be performed on behalf of the group",
-"См. СформироватьКлавиатуруИзМассиваКнопок": "See CreateKeyboardFromArrayButton",
-"Сформировать клавиатуру по массиву кнопок": "Generate keyboard from array of buttons",
-"См. СформироватьКлавиатуруПоМассивуКнопок": "See GenerateKeyboardFromArray",
-"Новые или изменяемые свойства базы данных": "New or modified database properties",
-"Изменяет свойства существуещего календаря": "Edits properties of an existing calendar",
-"Публикует объект диска в публичный доступ": "Publishes the disk object for public access",
-"Получает список всех комментариев объекта": "Gets the list of all comments of the object",
-"Создает комментарий под выбранной записью": "Creates a comment under the selected record",
-"Сформировать клавиатуру из массива кнопок": "Create a keyboard from an array of buttons",
-"ПолучитьСсылкуСкачиванияПубличногоОбъекта": "GetDownloadLinkForPublicObject",
-"Удаляет указанного пользователя из канала": "Removes specified user from channel",
+"Добавляет список файлов к полям каталога": "Adds a list of files to the directory fields",
+"Удаляет ранее созданный вариант свойства": "Deletes the previously created product property variant",
+"Создает комментарий к файлу или каталогу": "Creates a comment for a file or directory",
+"Удаляет текстовый тег файла или каталога": "Deletes the text tag of a file or directory",
+"Получает список версий (ревизий) объекта": "Gets the list of versions (revisions) of the object",
+"Получает информацию о пользователе по ID": "Gets user information by ID",
+"Изменяет текст существующего комментария": "Changes the text of an existing comment",
+"Загружает файл на диск по заданному пути": "Uploads a file to disk at the specified path",
 "Создает пустой каталог по выбранному пути": "Creates an empty directory at the selected path",
+"ОбработкаВходящегоЗапросаПослеАвторизации": "HandleIncomingRequestAfterAuthorization",
+"Возвращает URL для авторизации в браузере": "Returns URL for browser authorization",
+"Создает комментарий под выбранной записью": "Creates a comment under the selected record",
+"Получает список записей выбранной таблицы": "Gets the list of records of the selected table",
+"Публикует объект диска в публичный доступ": "Publishes the disk object for public access",
+"ПолучитьСсылкуСкачиванияПубличногоОбъекта": "GetDownloadLinkForPublicObject",
+"См. СформироватьКлавиатуруИзМассиваКнопок": "See CreateKeyboardFromArrayButton",
+"Новые или изменяемые свойства базы данных": "New or modified database properties",
 "Массив двоичных данных или путей к файлам": "Array of binary data or file paths",
 "Кодировка, в которой записаны JSON данные": "Encoding of JSON Data",
-"Получает список записей выбранной таблицы": "Gets the list of records of the selected table",
+"Сформировать клавиатуру из массива кнопок": "Create a keyboard from an array of buttons",
 "Добавляет указанных пользователей в канал": "Adds specified users to the channel",
-"Изменяет наименование и|или описание базы": "Changes the name and\/or description of the base",
-"Признак исключения архивированных каналов": "Indicator of excluding archived channels",
+"Сформировать клавиатуру по массиву кнопок": "Generate keyboard from array of buttons",
 "Получает описание поля с номером телефона": "Gets the description of a phone number field",
-"Возвращает URL для авторизации в браузере": "Returns URL for browser authorization",
+"Изменяет наименование и|или описание базы": "Changes the name and\/or description of the base",
+"См. СформироватьКлавиатуруПоМассивуКнопок": "See GenerateKeyboardFromArray",
+"действия будут выполняться от лица группы": "actions will be performed on behalf of the group",
+"Удаляет указанного пользователя из канала": "Removes specified user from channel",
+"Изменяет свойства существуещего календаря": "Edits properties of an existing calendar",
 "|--------[через 2 ч.]-------------------|": "|--------[after 2 hrs.]-------------------|",
-"Отправляет внейшний файл по списку каналов": "Sends an external file to a list of channels",
-"ID поста, используемого в качетсве рекламы": "ID of the post used for advertising",
+"Получает список всех комментариев объекта": "Gets the list of all comments of the object",
+"Признак исключения архивированных каналов": "Indicator of excluding archived channels",
 "JSON клавиатуры. См.СформироватьКлавиатуру": "JSON keyboard. See FormKeyboard",
-"Добавляет новый товар в каталог сообщества": "Adds a new product to the community's catalog",
-"Получает постоянный UTL к сообщению канала": "Gets a permanent URL to the channel message",
-"Ошибка преобразовани данных параметра JSON": "JSON Parameter Data Conversion Error",
-"Разбанивает забаненного ранее пользователя": "Unbans a previously banned user",
 "Очищает список событий основного календаря": "Clears the event list of the primary calendar",
+"Получает постоянный UTL к сообщению канала": "Gets a permanent URL to the channel message",
+"Добавляет новый товар в каталог сообщества": "Adds a new product to the community's catalog",
+"Отправляет внейшний файл по списку каналов": "Sends an external file to a list of channels",
 "Сформировать клавиатуру из массива кнопок:": "Create a keyboard from an array of buttons:",
 "Получить данные использования пространства": "Get space usage data",
-"Отменяет режим общего доступа для каталога": "Cancels the public access mode for the directory",
+"ID поста, используемого в качетсве рекламы": "ID of the post used for advertising",
+"Разбанивает забаненного ранее пользователя": "Unbans a previously banned user",
 "Отправляет файл (документ) в чат или канал": "Sends a file (document) to a chat or channel",
-"Красный, желтый, синий или какой-то другой?": "Red, yellow, blue, or some other?",
+"Отменяет режим общего доступа для каталога": "Cancels the public access mode for the directory",
+"Ошибка преобразовани данных параметра JSON": "JSON Parameter Data Conversion Error",
+"Обновляет v2 токен при помощи refresh_token": "Updates the v2 token using the refresh_token",
+"Ошибка получения данных булево из параметра": "Error getting boolean data from parameter",
+"Получает список отложенных сообщений канала": "Gets a list of delayed channel messages",
+"Получает описание поля с электронной почтой": "Gets the description of an email field",
 "Получает информацию о папке или файле по ID": "Gets information about a folder or file by ID",
 "Очистить список закрепленных сообщений темы": "Clear thread's pinned messages list",
-"ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных": "GetBinaryDataBufferFromBinaryData",
-"ID файла, к которому предоставляется доступ": "ID of the file to be accessed",
-"Получает описание поля с электронной почтой": "Gets the description of an email field",
-"Ошибка получения данных булево из параметра": "Error getting boolean data from parameter",
 "Получает информацию о товарах по массиву ID": "Gets information about products by array of IDs",
-"конкретное значение при указании имени поля": "Specific Value When Specifying Field Name",
-"Обновляет v2 токен при помощи refresh_token": "Updates the v2 token using the refresh_token",
-"Получает список отложенных сообщений канала": "Gets a list of delayed channel messages",
+"ID файла, к которому предоставляется доступ": "ID of the file to be accessed",
 "Удаляет ранее добавленный товар из подборки": "Removes a previously added product from the selection",
+"конкретное значение при указании имени поля": "Specific Value When Specifying Field Name",
+"Красный, желтый, синий или какой-то другой?": "Red, yellow, blue, or some other?",
+"ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных": "GetBinaryDataBufferFromBinaryData",
+"Создает ссылку для вступления в закрытый чат": "Creates a link for joining a closed chat",
+"Показывает ранее скрытую главную тему форума": "Shows a previously hidden main forum thread",
+"Приостанавливает показ рекламного объявления": "Pauses the display of the advertising post",
+"Добавляет вариант для существующего свойства": "Adds a variant for an existing property",
+"ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных": "GetBinaryDataFromBinaryDataBuffer",
+"Получает новый токен на основе рефреш токена": "Gets a new token based on the refresh token",
 "Создает рекламное объявление на основе поста": "Creates an advertising post based on a post",
+"Удалить объект без возможности востановления": "Delete object without the possibility of recovery",
+"Преобразует файл с Base64 строкой в бинарный": "Convert Base64 String to Binary File",
+"Похоже, что в ответе пришли двоичные данные!": "It Seems Binary Data Was Received in Response!",
+"Переводит каталог в режим публичного доступа": "Sets the directory to public access mode",
 "Загружает файлы на сервер и возвращает их ID": "Uploads files to the server and returns their IDs",
 "Копирует файл или каталог по выбранному пути": "Copies a file or directory to the selected path",
-"ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных": "GetBinaryDataFromBinaryDataBuffer",
-"Преобразует файл с Base64 строкой в бинарный": "Convert Base64 String to Binary File",
-"Приостанавливает показ рекламного объявления": "Pauses the display of the advertising post",
-"Удалить объект без возможности востановления": "Delete object without the possibility of recovery",
-"Показывает ранее скрытую главную тему форума": "Shows a previously hidden main forum thread",
-"Похоже, что в ответе пришли двоичные данные!": "It Seems Binary Data Was Received in Response!",
-"Создает ссылку для вступления в закрытый чат": "Creates a link for joining a closed chat",
-"Добавляет вариант для существующего свойства": "Adds a variant for an existing property",
-"Переводит каталог в режим публичного доступа": "Sets the directory to public access mode",
-"Получает новый токен на основе рефреш токена": "Gets a new token based on the refresh token",
+"Получить ссылку скачивания публичного объекта": "Get download link for public object",
+"Требования: платформа 1С версии 8.3.10 и выше": "Requirements: 1C platform version 8.3.10 and above",
+"Раскомментировать, если выполняется OneScript": "Uncomment if OneScript is executed",
+"Повторно открывает ранее закрытую тему форума": "Reopens a previously closed forum thread",
+"Возвращает структура клавиатуры для сообщений": "Returns a keyboard structure for messages",
 "Получает список пользователей рабочей области": "Gets a list of users in the workspace",
 "Идентификатор новой подборки, если необходимо": "Identifier of the new selection, if needed",
-"Раскомментировать, если выполняется OneScript": "Uncomment if OneScript is executed",
-"Возвращает структура клавиатуры для сообщений": "Returns a keyboard structure for messages",
-"Повторно открывает ранее закрытую тему форума": "Reopens a previously closed forum thread",
-"Требования: платформа 1С версии 8.3.10 и выше": "Requirements: 1C platform version 8.3.10 and above",
 "Не удалось получить информацию из json медиа!": "Failed to Retrieve Information from JSON media!",
-"Получить ссылку скачивания публичного объекта": "Get download link for public object",
-"Число последних версий объекта для отображения": "Number of the latest versions of the object to display",
-"Расположение 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",
-"Получает общую статистику сообщества за период": "Gets the overall community statistics for a period",
-"Клавиатура под сообщением или на нижней панели": "Keyboard under the message or on the bottom panel",
-"Отправляет контакт с именем и номером телефона": "Sends a contact with name and phone number",
 "Отправляет текстовое сообщение в чат или канал": "Sends a text message to a chat or channel",
-"Формирует ссылку для авторизации через браузер": "Forms a link for authorization via the browser",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_VK.os": "Location OS: .\/OInt\/core\/Modules\/OPI_VK.os",
 "Список адресов почты добавляемых пользователей": "List of email addresses of users being added",
+"URL, по которому необходимо перейти в браузере": "URL to go to in the browser",
+"Формирует ссылку для авторизации через браузер": "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",
+"Ошибка получения двоичных данных из параметра:": "Error getting binary data from parameter:",
+"Получает общую статистику сообщества за период": "Gets the overall community statistics for a period",
+"Число последних версий объекта для отображения": "Number of the latest versions of the object to display",
+"Получает список файлов с или без отбора по типу": "Gets a list of files with or without filtering by type",
+"Отправляет URL с предпросмотром в чат или канал": "Sends a URL with a preview to a chat or channel",
+"Получает список пользователей указанного канала": "Gets a list of users in the specified channel",
+"Массив имен для добавления новых листов в книгу": "Array of names to add new sheets to the book",
 "Получает список комментариев к записи в таблице": "Gets the list of comments for a record in the table",
+"Создает кампанию в выбранном рекламном кабинете": "Creates a campaign in the selected advertising account",
+"Dropbox_ПолучитьДанныеИспользованияПространства": "Dropbox_GetSpaceUsageData",
 "Путь к объекту, тег которого необходимо удалить": "Path to the object whose tag needs to be deleted",
 "Получает календарь из списка пользователя по ID": "Gets a calendar from the user's list by ID",
-"Отправляет URL с предпросмотром в чат или канал": "Sends a URL with a preview to a chat or channel",
-"Dropbox_ПолучитьДанныеИспользованияПространства": "Dropbox_GetSpaceUsageData",
-"Массив имен для добавления новых листов в книгу": "Array of names to add new sheets to the book",
-"Создает кампанию в выбранном рекламном кабинете": "Creates a campaign in the selected advertising account",
-"Получает список файлов с или без отбора по типу": "Gets a list of files with or without filtering by type",
-"Получает список пользователей указанного канала": "Gets a list of users in the specified channel",
-"двоичные данные zip архива с содержимым каталога": "binary data of the zip archive with the contents of the directory",
-"Добавляет сообщение в обсуждение от имени группы": "Adds a message to the discussion on behalf of the group",
-"Создает новый блок на основе существующего блока": "Creates a new block based on an existing block",
-"Некорректный метод! Проверьте правильность ввода": "Incorrect method! Check input correctness",
-"Истина > сортировать по дате, Ложь > по алфавиту": "True > sort by date, False > alphabetically",
-"Получает данные строки таблицы по идентификатору": "Gets row data of the table by identifier",
-"Получает токен по коду из авторизации в бразуере": "Gets token by code from browser authorization",
-"Созвращает список дочерних блоков блока-родителя": "Returns list of child blocks of parent block",
 "Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы": "Telegram_ClearPinnedMessagesList",
-"Расположение OS: .\/OInt\/core\/Modules\/OPI_Slack.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Slack.os",
+"Получает токен по коду из авторизации в бразуере": "Gets token by code from browser authorization",
+"Добавляет сообщение в обсуждение от имени группы": "Adds a message to the discussion on behalf of the group",
+"Получает данные строки таблицы по идентификатору": "Gets row data of the table by identifier",
+"Созвращает список дочерних блоков блока-родителя": "Returns list of child blocks of parent block",
+"Создает новый блок на основе существующего блока": "Creates a new block based on an existing block",
+"Истина > сортировать по дате, Ложь > по алфавиту": "True > sort by date, False > alphabetically",
+"Некорректный метод! Проверьте правильность ввода": "Incorrect method! Check input correctness",
+"двоичные данные zip архива с содержимым каталога": "binary data of the zip archive with the contents of the directory",
 "Твиттер не смог обработать загруженное вами видео": "Twitter could not process the video you uploaded",
+"ID подборка для помещения товара, если необходимо": "Selection ID for placing the product, if needed",
 "Путь к каталогу. Необязателен, если указан курсор": "Path to the directory. Optional if the cursor is specified",
-"Отменяет публикацию ранее опубликованного объекта": "Unpublishes a previously published object",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Slack.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Slack.os",
+"Преобразует файл с Base64 строкой в бинарный файл": "Convert file with Base64 string to binary file",
 "Источник: https:github.com\/vbondarevsky\/Connector": "Source: https:github.com\/vbondarevsky\/Connector",
+"Отменяет публикацию ранее опубликованного объекта": "Unpublishes a previously published object",
 "Расположение OS: .\/OInt\/core\/Modules\/OPI_Viber.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Viber.os",
 "Идентификатор или массив индентификаторов записей": "Identifier or array of record identifiers",
-"ID подборка для помещения товара, если необходимо": "Selection ID for placing the product, if needed",
-"Преобразует файл с Base64 строкой в бинарный файл": "Convert file with Base64 string to binary file",
-"Некорректная команда! Проверьте правильность ввода": "Incorrect command! Check input correctness",
-"Создает новое свойство для использования в товарах": "Creates a new property for use in products",
-"Запрещает доступ к файлу для внешних пользователей": "Prohibits access to the file for external users",
-"ID блока, после которого необходимо встаивть новый": "Block ID after which to insert the new one",
-"Добавляет новый текстовый тег к файлу или каталогу": "Adds a new text tag to a file or directory",
 "Расположение OS: .\/OInt\/core\/Modules\/OPI_Notion.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Notion.os",
-"ID асинхронной работы из ответа ЗагрузитьФайлПоURL": "ID of the asynchronous job from the UploadFileByURL response",
 "Не удалось привести структуру значений к коллекции": "Failed to convert the structure of values to a collection",
+"Добавляет новый текстовый тег к файлу или каталогу": "Adds a new text tag to a file or directory",
+"Создает новое свойство для использования в товарах": "Creates a new property for use in products",
 "Данные заполнения, где ключ это имя ячейки вида A1": "Fill data where the key is the cell name like A1",
+"Некорректная команда! Проверьте правильность ввода": "Incorrect command! Check input correctness",
 "Удаляет одну или массив записей по идентификаторам": "Deletes one or an array of records by identifiers",
-"Путь к объекту, для которого необходимо создать тег": "Path to the object for which the tag needs to be created",
-"Расположение OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os",
-"Коннектор: удобный HTTP-клиент для 1С:Предприятие 8": "Connector: convenient HTTP client for 1C:Enterprise 8",
-"Очищает список закрепленных сообщений в теме форума": "Clears the list of pinned messages in the forum thread",
+"Запрещает доступ к файлу для внешних пользователей": "Prohibits access to the file for external users",
+"ID асинхронной работы из ответа ЗагрузитьФайлПоURL": "ID of the asynchronous job from the UploadFileByURL response",
+"ID блока, после которого необходимо встаивть новый": "Block ID after which to insert the new one",
 "Расположение OS: .\/OInt\/core\/Modules\/OPI_Twitter.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Twitter.os",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os",
+"Очищает список закрепленных сообщений в теме форума": "Clears the list of pinned messages in the forum thread",
 "Изменяет свойства календаря из списка пользователей": "Edits the properties of a calendar from the user's list",
+"Путь к объекту, для которого необходимо создать тег": "Path to the object for which the tag needs to be created",
+"Коннектор: удобный HTTP-клиент для 1С:Предприятие 8": "Connector: convenient HTTP client for 1C:Enterprise 8",
 "Смещение для получение объектов не из начала списка": "Offset for getting objects not from the beginning of the list",
-"Отправляет географические координаты в чат или канал": "Sends geographic coordinates to a chat or channel",
-"Расположение OS: .\/OInt\/core\/Modules\/OPI_Airtable.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Airtable.os",
-"Скачивает zip архив с содержимым указанного каталога": "Downloads a zip archive with the contents of the specified directory",
 "Истина > кнопки выводятся в столбик, Ложь > в строку": "True > buttons are displayed in a column, False > in a row",
-"Загружает файл на диск, забирая его по заданному URL": "Downloads a file to disk from the specified URL",
-"Обрабатывает данные TMA и опредеяет их достоверность": "Processes TMA data and determines its validity",
-"Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexID.os": "Location OS: .\/OInt\/core\/Modules\/OPI_YandexID.os",
-"Написать сообщение пользователю в диалоге сообщества": "Write a message to a user in the community's dialog",
-"Основное измерение при заполнении диапазона массивом": "Main dimension when filling the array range",
 "Здесь собрано определение данных для работы с VK API": "Here is a collection of data definitions for working with the VK API",
-"Описание таблиц: Ключ > имя, Значение > массив полей": "Table description: Key > name, Value > array of fields",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexID.os": "Location OS: .\/OInt\/core\/Modules\/OPI_YandexID.os",
 "Расположение OS: .\/OInt\/core\/Modules\/OPI_Telegram.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Telegram.os",
-"Генерирует ссылку авторизации для перехода в браузере": "Generates an authorization link for browser transition",
-"Возвращает список пользователей рабочего пространства": "Returns a list of workspace users",
-"Отправляет контакт с номером телефона в чат или канал": "Sends a contact with a phone number to a chat or channel",
+"Скачивает zip архив с содержимым указанного каталога": "Downloads a zip archive with the contents of the specified directory",
+"Отправляет географические координаты в чат или канал": "Sends geographic coordinates to a chat or channel",
+"Основное измерение при заполнении диапазона массивом": "Main dimension when filling the array range",
+"Загружает файл на диск, забирая его по заданному URL": "Downloads a file to disk from the specified URL",
+"Написать сообщение пользователю в диалоге сообщества": "Write a message to a user in the community's dialog",
+"Обрабатывает данные TMA и опредеяет их достоверность": "Processes TMA data and determines its validity",
+"Описание таблиц: Ключ > имя, Значение > массив полей": "Table description: Key > name, Value > array of fields",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Airtable.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Airtable.os",
 "Определяет доступ к файлу для стороннего пользователя": "Defines access to the file for an external user",
-"Группирует товары на основе одинаковых наборов свойств": "Groups products based on similar sets of properties",
+"Отправляет контакт с номером телефона в чат или канал": "Sends a contact with a phone number to a chat or channel",
+"Возвращает список пользователей рабочего пространства": "Returns a list of workspace users",
+"Генерирует ссылку авторизации для перехода в браузере": "Generates an authorization link for browser transition",
 "Добавляет существующий календарь в список пользователя": "Adds an existing calendar to the user's list",
 "Изменяет имя и|или описание существующего поля таблицы": "Changes the name and\/or description of an existing table field",
-"Перемещает объект по заданному пути и пути к оригиналу": "Moves the object to the specified path and path to the original",
-"Перезаписывать если файл с таким именем уже существует": "Overwrite if a file with the same name already exists",
 "Получает список внешних файлов пользователя или канала": "Gets a list of external files of a user or channel",
+"Перемещает объект по заданному пути и пути к оригиналу": "Moves the object to the specified path and path to the original",
+"Группирует товары на основе одинаковых наборов свойств": "Groups products based on similar sets of properties",
+"Перезаписывать если файл с таким именем уже существует": "Overwrite if a file with the same name already exists",
 "Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexDisk.os": "OS Location: .\/OInt\/core\/Modules\/OPI_YandexDisk.os",
 "ID аккаунта. Текущий аккаунт токена, если не заполнено": "Account ID. Current token account if not filled",
 "Получает информацию об объекте диска по заданному пути": "Gets information about a disk object at the specified path",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os",
 "Предоставляет стороннии пользователям доступ к каталогу": "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",
-"Получает статус асинхронной работы по изменению доступов": "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",
 "Получает информацию об опубликованном объекте по его 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",
+"Создает дочернюю страницу над другой страницей-родителем": "Creates a child page above another parent page",
+"Отправляет сообщение, которое приходит в канал, но видно": "Sends a message that arrives in the channel but is visible",
+"Получает прямую ссылку для скачивания публичного объекта": "Gets a direct link to download the public object",
 "Соответствие данных с результатом проверки в поле passed": "Map of data with the result of verification in the passed field",
 "Добавляет дополнительные поля информации для медиафайлов": "Adds additional information fields for media files",
 "Изменяет значение варианта существующего свойства товара": "Edits the value of an existing product property variant",
-"Создает дочернюю страницу над другой страницей-родителем": "Creates a child page above another parent page",
-"Идентификатор объекта, для которого необходим комментарий": "Identifier of the object that needs a comment",
-"Создает новую тему в группе с включенным функционалом тем": "Creates a new thread in the group with theme functionality enabled",
-"Получает список рабочих областей, в которых подключен бот": "Gets a list of workspaces where the bot is connected",
+"Получает статус асинхронной работы по изменению доступов": "Gets the status of the asynchronous access change job",
 "Удаляет публичный URL у файла. Требует токен пользователя": "Removes the public URL from the file. Requires user token",
-"Пересылает сообщение между чатами или в рамках одного чата": "Forwards a message between chats or within a chat",
-"Загружает фото на сервер для его дальнейшего использования": "Uploads photo to server for further use",
-"Создает копию объекта по заданному пути и пути к оригиналу": "Creates a copy of the object at the specified path and path to the original",
-"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os",
+"Идентификатор объекта, для которого необходим комментарий": "Identifier of the object that needs a comment",
+"Получает список рабочих областей, в которых подключен бот": "Gets a list of workspaces where the bot is connected",
+"Создает новую тему в группе с включенным функционалом тем": "Creates a new thread in the group with theme functionality enabled",
 "Запрещает редактирование файла для стороннего пользователя": "Prohibits file editing for the external user",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os",
+"Загружает фото на сервер для его дальнейшего использования": "Uploads photo to server for further use",
+"Пересылает сообщение между чатами или в рамках одного чата": "Forwards a message between chats or within a chat",
+"Создает копию объекта по заданному пути и пути к оригиналу": "Creates a copy of the object at the specified path and path to the original",
+"Код, полученный из авторизации См.ПолучитьСсылкуАвторизации": "Code obtained from authorization See GetAuthorizationLink",
+"Создает публичный URL для файла. Требует токен пользователя": "Creates a public URL for the file. Requires user token",
+"Вы можете переопределять их, передавая в качестве параметра": "You can override them by passing them as a parameter",
+"Расположение OS: .\/OInt\/tests\/Modules\/internal\/OPI_Тесты.os": "Location OS: .\/OInt\/tests\/Modules\/internal\/OPI_Tests.os",
 "Истина > служебные поля удаляются, остается только сам блок": "True > service fields are deleted, only the block itself remains",
 "Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleWorkspace.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleWorkspace.os",
-"Расположение 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",
-"Создает публичный 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",
 "Имя поля для получения. Выводит весь список, если не указано": "Field name to retrieve. Displays the entire list if not specified",
-"Смещение для получение вложенных объектов не из начала списка": "Offset for getting nested objects not from the beginning of the list",
+"механизм загрузки файлов и некоторые другие из старой версии": "file upload mechanism and some others from the old version",
 "Иднтификатор следующей страницы данных из предыдущего запроса": "Next page identifier of data from the previous request",
-"Открывает новый диалог с одним или несколькими пользователями": "Opens a new dialog with one or more users",
 "Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено": "String, Arbitrary, HTTPResponse, BinaryData, Undefined",
+"Смещение для получение вложенных объектов не из начала списка": "Offset for getting nested objects not from the beginning of the list",
 "Указатель из предыдущего запроса, если строк результата > 100": "Pointer from the previous request, if the result rows > 100",
+"Открывает новый диалог с одним или несколькими пользователями": "Opens a new dialog with one or more users",
 "Токен бота чата сообщества, котрый можно получить в настройках": "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",
-"Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПреобразованиеТипов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TypeConversion.os",
+"Игнорируем проверку целостности архива, просто читаем результат": "Ignore archive integrity check, just read the result",
+"Получает массив сообщений, которые являются ответом на указанное": "Gets an array of messages that are replies to the specified",
 "Набор или массив наборов пар Ключ : Значение > Поле : Показатель": "Set or array of sets of Key : Value pairs > Field : Indicator",
 "Удаляет 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",
 "Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок": "Keyboard, if needed, see CreateKeyboardFromArrayButton",
 "Идентификатор следующей страницы списка баз из перыдудщего запроса": "Next page identifier of the base list from the previous request",
 "Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПолучениеДанныхТестов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TestDataRetrieval.os",
-"Совпадающие поля будут перезаписаны с приоритетом параметра функции": "Matching fields will be overwritten with the parameter of the function",
-"ID пользователя. Для канала > администратора, для бота > получателя": "User ID. For channel > administrator, for bot > recipient",
-"Формирует блок с картинкой для добавления в массив блоков сообщения": "Generates a block with an image to add to the message block array",
 "Ограничение на ур. вложенности разбора. На всю глубину по умолчанию": "Parsing depth limit. Full depth by default",
+"Формирует блок с картинкой для добавления в массив блоков сообщения": "Generates a block with an image to add to the message block array",
+"ID пользователя. Для канала > администратора, для бота > получателя": "User ID. For channel > administrator, for bot > recipient",
+"Совпадающие поля будут перезаписаны с приоритетом параметра функции": "Matching fields will be overwritten with the parameter of the function",
 "на redirect_uri после авторизации через браузер есть всего 30 секунд": "on redirect_uri after authorization via the browser is only 30 seconds",
 "Курсор из предыдущего запроса для получения следующего набора файлов": "Cursor from the previous request to get the next set of files",
 "Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации": "Gets token based on the code from the GetAuthorizationLink page",
 "Загружает видео в группу с возможностью его дальнейшего использования": "Uploads video to the group for further use",
-"Получает список ID товарных категорий для указания при создании товара": "Gets a list of product category IDs to specify when creating a product",
 "Устанавливает URL обработчика событий бота для работы в режиме Webhook": "Set webhook URL for bot event handling in webhook mode",
-"access_token нужно будет забрать из параметра в строке адреса браузера": "access_token will need to be taken from the parameter in the browser address bar",
+"Получает список ID товарных категорий для указания при создании товара": "Gets a list of product category IDs to specify when creating a product",
 "Двоичные данные или путь к файлу при указании параметра ПутьСохранения": "Binary data or file path when SavePath parameter is specified",
+"access_token нужно будет забрать из параметра в строке адреса браузера": "access_token will need to be taken from the parameter in the browser address bar",
 "В следующий раз используйте опцию --out для указания пути их сохранения": "Next time, use the --out option to specify the path for saving",
 "Получает информацию о количестве использованного дискового пространства": "Gets information on the amount of used disk space",
 "Полную документацию можно найти по адресу: (https:\/\/openintegrations.dev": "Full documentation can be found at: (https:\/\/openintegrations.dev",
-"Расположение 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",
+"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Инструменты.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Tools.os",
 "Получает список id рекламных категорий для создания рекламного объявления": "Gets a list of advertising category IDs for creating an advertising post",
-"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Криптография.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Cryptography.os",
 "Метод для вставки в 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",
 "Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer": "From OAuth 2.0 Client ID and Client Secret settings page of Twitter Developer",
-"Отправляет местоположение по географической широте и долготе в чат или канал": "Sends location by geographic latitude and longitude to a chat or channel",
 "Показывает значения, которые можно получить из переданного JSON и возвращает": "Displays the values that can be obtained from the passed JSON and returns",
-"Получает код подтверждения и адрес страницы, на которой его необходимо ввести": "Gets the confirmation code and the address of the page where it needs to be entered",
+"Отправляет местоположение по географической широте и долготе в чат или канал": "Sends location by geographic latitude and longitude to a chat or channel",
 "Размер файла. Если не заполнен > определяется автоматически скачиванием файла": "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",
-"1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1": "1, and something on 2: up to the point that they removed the ability to post tweets from v1",
 "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",
 "ID пользователя из информации о канале не подойдет для отправки сообщений через бота": "The user ID from channel information is not suitable for sending messages through the bot",
 "Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения": "Converts the code to a token after entering the code when executing GetConfirmationCode",
-"Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя": "All pages created as children must have parent base properties",
 "|--> ОбновитьТокен() ->|access_token  --> Используется в т-нии 2-х часов для запросов": "|--> RefreshToken() ->| access_token --> Used in the interval of 2 hours for requests",
 "Файл не был записан! Используйте флаг --debug для получения дополнительной информации": "File was not saved! Use the --debug flag for more information",
+"Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя": "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",
-"Получение ссылки для интерактивного получения токена (access_token), который необходим": "Getting a link for interactive token retrieval (access_token), which is necessary",
 "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",
+"Получение ссылки для интерактивного получения токена (access_token), который необходим": "Getting a link for interactive token retrieval (access_token), which is necessary",
 "набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен": "a set of permissions for the received key. Can be any, but offline.access is mandatory",
 "Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer": "From Authentication Tokens -> Access Token and Secret settings page of Twitter Developer",
 "можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях": "you can use an HTTP service. Information about new messages will also be sent there",
 "При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить": "For the next update, you need to use a new refresh_token, so hardcode",
-"Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации": "Gets the token by the code obtained during authorization via the link from GetAuthorizationLink",
 "Приходит вместе с 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",
diff --git a/service/dictionaries/keywords.json b/service/dictionaries/keywords.json
new file mode 100644
index 0000000000..73282eae56
--- /dev/null
+++ b/service/dictionaries/keywords.json
@@ -0,0 +1,50 @@
+{
+"ВызватьИсключение":"Raise",
+"Выполнить":"Execute",
+"ДобавитьОбработчик":"AddHandler",
+"Для":"For",
+"Если":"If",
+"Знач":"Val",
+"И":"And",
+"Из":"In",
+"ИЛИ,Или":"Or",
+"Иначе":"Else",
+"ИначеЕсли":"ElsIf",
+"Исключение":"Except",
+"Истина":"True",
+"Каждого,каждого":"Each,each",
+"КонецЕсли":"EndIf",
+"КонецПопытки":"EndTry",
+"КонецПроцедуры":"EndProcedure",
+"КонецФункции":"EndFunction",
+"КонецЦикла":"EndDo",
+"Не":"Not",
+"Неопределено":"Undefined",
+"Перейти":"Goto",
+"Перем":"Var",
+"По":"For",
+"Пока":"WHile",
+"Попытка":"Try",
+"Процедура":"Procedure",
+"Прервать":"Break",
+"Продолжить":"Continue",
+"Тогда":"Then",
+"Цикл":"Do",
+"УдалитьОбработчик":"RemoveHandler",
+"Функция":"Function",
+"Экспорт":"Export",
+"ВебКлиент":"WebClient",
+"ВнешнееСоединение":"ExternalConnection",
+"КонецОбласти":"EndRegion",
+"Клиент":"Client",
+"МобильноеПриложениеКлиент":"MobileAppClient",
+"МобильноеПриложениеСервер":"MobileAppServer",
+"МобильныйКлиент":"MobileClient",
+"НаКлиенте":"AtClient",
+"НаСервере":"AtServer",
+"Область":"Region",
+"Сервер":"Server",
+"ТолстыйКлиентОбычноеПриложение":"ThickClientOrdinaryApplication",
+"ТолстыйКлиентУправляемоеПриложение":"ThickClientManagedApplication",
+"ТонкийКлиент":"ThinClient"
+}
\ No newline at end of file
diff --git a/service/interim/en/OPI/.project b/service/interim/en/OPI/.project
new file mode 100644
index 0000000000..5b6683c1ce
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/.settings/org.eclipse.core.resources.prefs b/service/interim/en/OPI/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..d21dc84127
--- /dev/null
+++ b/service/interim/en/OPI/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/service/interim/en/OPI/DT-INF/PROJECT.PMF b/service/interim/en/OPI/DT-INF/PROJECT.PMF
new file mode 100644
index 0000000000..f82b4856d1
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
new file mode 100644
index 0000000000..719401ad78
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
@@ -0,0 +1,681 @@
+// Location OS: ./OInt/core/Modules/OPI_Airtable.os
+// Library: Airtable
+// CLI Command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region DatabaseWork
+
+// Get list of bases
+// Gets the list of available bases
+// 
+// Parameters:
+//  Token  - String - Token                                                              - token
+//  Indent - String - Next page identifier of the base list from the previous request - offset
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable 
+Function GetListOfBases(Val Token, Val Indent = "") Export
+    
+    OPI_TypeConversion.GetLine(Indent);
+    
+    URL        = "https://api.airtable.com/v0/meta/bases";
+    Headers  = GetAuthorizationHeader(Token);
+    Parameters  = New Structure;
+    
+    OPI_Tools.AddField("offset", Indent, "String", Parameters);
+    
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get base tables
+// Gets the schema of base tables
+// 
+// Parameters:
+//  Token - String - Token              - token
+//  Base  - String - Base identifier - base
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function GetDatabaseTables(Val Token, Val Base) Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    
+    URL        = "https://api.airtable.com/v0/meta/bases/" + Base + "/tables";
+    Headers  = GetAuthorizationHeader(Token);
+    
+    Response = OPI_Tools.Get(URL, , Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Create base
+// Creates a new database
+// 
+// Parameters:
+//  Token               - String                    - Token                                                - token
+//  Workspace - String                    - Workspace identifier                  - ws
+//  Name        - String                    - New base name                              - title
+//  TableCollection - Key-Value Pair - Table description: Key > name, Value > array of fields - tablesdata
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function CreateDatabase(Val Token, Val Workspace, Val Name, Val TableCollection) Export
+    
+    OPI_TypeConversion.GetCollection(TableCollection);
+    
+    If Not TypeValue(TableCollection) = Type("Structure")
+        And Not TypeValue(TableCollection) = Type("Match") Then
+        
+        Raise "Error in table collection data";
+        
+    EndIf;
+    
+    URL           = "https://api.airtable.com/v0/meta/bases";
+    Headers     = GetAuthorizationHeader(Token);
+    TableArray  = New Array;
+    
+    For Each Table In TableCollection Do
+        
+        Description = GenerateTableDescription(Table.Key, Table.Value);
+        TableArray.Add(Description);
+        
+    EndDo;
+ 
+    Parameters = New Structure;
+    OPI_Tools.AddField("name"       , Name       , "String", Parameters);
+    OPI_Tools.AddField("tables"     , TableArray       , "Array", Parameters);
+    OPI_Tools.AddField("workspaceId", Workspace, "String", Parameters);
+     
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region TableManagement
+
+// Create table
+// Creates a new table in the base
+// 
+// Parameters:
+//  Token        - String              - Token                      - token
+//  Base         - String              - Base identifier         - base
+//  Name - String              - New table name - title
+//  FieldArray  - Array of Structures - Array of field descriptions      - fieldsdata
+//  Description     - String              - Table description           - description
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function CreateTable(Val Token, Val Base, Val Name, Val FieldArray, Val Description = "") Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    
+    URL        = "https://api.airtable.com/v0/meta/bases/" + Base + "/tables";
+    Headers  = GetAuthorizationHeader(Token);
+    Parameters  = GenerateTableDescription(Name, FieldArray, Description); 
+    
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Modify table
+// Changes the name and/or description of the base
+// 
+// Parameters:
+//  Token        - String  - Token                  - token
+//  Base         - String  - Base identifier     - base
+//  Table      - String  - Table identifier  - table
+//  Name - String  - New name     - title
+//  Description     - String  - New description         - description
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function ModifyTable(Val Token, Val Base, Val Table, Val Name = "", Val Description = "") Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    
+    URL        = "https://api.airtable.com/v0/meta/bases/" + Base + "/tables/" + Table;
+    Headers  = GetAuthorizationHeader(Token);
+    Parameters  = New Structure; 
+    
+    OPI_Tools.AddField("name"       , Name, "String", Parameters);
+    OPI_Tools.AddField("description", Description    , "String", Parameters);
+    
+    Response = OPI_Tools.Patch(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region FieldWork
+
+// Create field
+// Creates a new field in the table
+// 
+// Parameters:
+//  Token         - String                     - Token                  - token
+//  Base          - String                     - Base identifier     - base
+//  Table       - String                     - Table identifier  - table
+//  FieldStructure - Structure of Key-Value - Description of the new field   - fielddata
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function CreateField(Val Token, Val Base, Val Table, Val FieldStructure) Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetCollection(FieldStructure);
+    
+    If Not TypeValue(FieldStructure) = Type("Structure")
+        And Not TypeValue(FieldStructure) = Type("Match") Then
+        
+        Raise "Error in field description data";
+        
+    EndIf;
+    
+    URL        = "https://api.airtable.com/v0/meta/bases/" + Base + "/tables/" + Table + "/fields";
+    Headers  = GetAuthorizationHeader(Token); 
+        
+    Response = OPI_Tools.Post(URL, FieldStructure, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Modify field
+// Changes the name and/or description of an existing table field
+// 
+// Parameters:
+//  Token        - String - Token                   - token
+//  Base         - String - Base identifier Base - base
+//  Table      - String - Table identifier   - table
+//  Field         - String - Field identifier      - field
+//  Name - String - New name      - title
+//  Description     - String - New description          - description
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function ModifyField(Val Token, Val Base, Val Table, Val Field, Val Name = "", Val Description = "") Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetLine(Field);
+    
+    URL = "https://api.airtable.com/v0/meta/bases/" 
+        + Base 
+        + "/tables/" 
+        + Table 
+        + "/fields/" 
+        + Field;
+        
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure();
+    OPI_Tools.AddField("name"       , Name, "String", Parameters);
+    OPI_Tools.AddField("description", Description    , "String", Parameters);
+        
+    Response = OPI_Tools.Patch(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get поле (withтроtoоinое)
+// Gets the description of a string field
+// 
+// Parameters:
+//  Name - String - New field name - title
+// 
+// Return value:
+//  Structure -  Field description
+Function GetStringField(Val Name) Export
+    Return PrimitiveFieldDescription(Name, "richText");
+EndFunction
+
+// Get поле (чиwithлоinое)
+// Gets the description of a numeric field
+// 
+// Parameters:
+//  Name - String       - New field name   - title
+//  Precision     - Number, String - Number of decimal places - precision
+// 
+// Return value:
+//  Structure -  Field description
+Function GetNumberField(Val Name, Val Precision = 0) Export
+    
+    OPI_TypeConversion.GetNumber(Precision);
+    
+    OptionsStructure = New Structure("precision", Precision);
+    Return PrimitiveFieldDescription(Name, "number", OptionsStructure);
+    
+EndFunction
+
+// Get поле (file)
+// Gets the description of a file field
+// 
+// Parameters:
+//  Name - String - Field name - title
+// 
+// Return value:
+//  Structure -  Field description
+Function GetAttachmentField(Val Name) Export
+    Return PrimitiveFieldDescription(Name, "multipleAttachments");
+EndFunction
+
+// Get поле (флажоto)
+// Gets the description of a boolean field
+// 
+// Parameters:
+//  Name - String - Field name - title
+// 
+// Return value:
+//  Structure -  Field description
+Function GetCheckboxField(Val Name) Export
+    
+    OptionsStructure = New Structure("icon,color", "check", "yellowBright");
+    Return PrimitiveFieldDescription(Name, "checkbox", OptionsStructure);
+    
+EndFunction
+
+// Get поле (dата)
+// Gets the description of a date field
+// 
+// Parameters:
+//  Name - String - Field name - title
+// 
+// Return value:
+//  Structure -  Field description
+Function GetDateField(Val Name) Export
+    
+    FormatStructure = New Structure("format,name", "YYYY-MM-DD", "iso");
+    OptionsStructure   = New Structure("dateFormat", FormatStructure);
+    
+    Return PrimitiveFieldDescription(Name, "date", OptionsStructure);
+    
+EndFunction
+
+// Get поле (email)
+// Gets the description of an email field
+// 
+// Parameters:
+//  Name - String - Field name - title
+// 
+// Return value:
+//  Structure -  Field description
+Function GetEmailField(Val Name) Export
+    Return PrimitiveFieldDescription(Name, "email");
+EndFunction
+
+// Get поле (телефон)
+// Gets the description of a phone number field
+// 
+// Parameters:
+//  Name - String - Field name - title
+// 
+// Return value:
+//  Structure -  Field description
+Function GetPhoneField(Val Name) Export
+    Return PrimitiveFieldDescription(Name, "phoneNumber");
+EndFunction
+
+// Get поле (url)
+// Gets the description of a URL field
+// 
+// Parameters:
+//  Name - String - Field name - title
+// 
+// Return value:
+//  Structure -  Field description
+Function GetLinkField(Val Name) Export
+    Return PrimitiveFieldDescription(Name, "url");
+EndFunction
+
+#EndRegion
+
+#Region RecordManagement
+
+// Get list of records
+// Gets the list of records of the selected table
+// 
+// Parameters:
+//  Token   - String - Token                                                         - token
+//  Base    - String - Database identifier                                     - base
+//  Table - String - Table identifier                                         - table
+//  Indent  - String - Next page identifier of data from the previous request - offset
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function GetListOfRecords(Val Token, Val Base, Val Table, Val Indent = "") Export
+
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    
+    URL        = "https://api.airtable.com/v0/" + Base + "/" + Table;
+    Headers  = GetAuthorizationHeader(Token);
+     
+    Parameters  = New Structure();
+    OPI_Tools.AddField("offset", Indent, "String", Parameters);
+        
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get record
+// Gets row data of the table by identifier
+// 
+// Parameters:
+//  Token   - String - Token                          - token
+//  Base    - String - Database identifier      - base
+//  Table - String - Table identifier          - table
+//  Record  - String - Record identifier in the table - record
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function GetRecord(Val Token, Val Base, Val Table, Val Record) Export
+   
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetLine(Record);
+    
+    URL        = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record;
+    Headers  = GetAuthorizationHeader(Token);
+
+    Response = OPI_Tools.Get(URL, , Headers);
+    
+    Return Response;
+     
+EndFunction
+
+// Create records
+// Creates one or an array of records by description or an array of field value descriptions
+// 
+// Parameters:
+//  Token   - String                         - Token                                                            - token
+//  Base    - String                         - Database identifier                                        - base
+//  Table - String                         - Table identifier                                            - table
+//  Data  - Structure, Array of Structures - Set or array of sets of Key : Value pairs > Field : Indicator - data
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function CreatePosts(Val Token, Val Base, Val Table, Val Data) Export
+
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetCollection(Data);
+    
+    Parameters = New Structure();
+    AddDataDescription(Data, Parameters);    
+
+    URL        = "https://api.airtable.com/v0/" + Base + "/" + Table;
+    Headers  = GetAuthorizationHeader(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;    
+    
+EndFunction
+
+// Delete records
+// Deletes one or an array of records by identifiers
+// 
+// Parameters:
+//  Token   - String                   - Token                                             - token
+//  Base    - String                   - Database identifier                         - base
+//  Table - String                   - Table identifier                             - table
+//  Records  - String, Array of Strings - Identifier or array of record identifiers - records
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function DeletePosts(Val Token, Val Base, Val Table, Val Records) Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetArray(Records);
+    
+    RecordString = "";
+    
+    For Each Record In Records Do
+        RecordString = RecordString
+            + ?(ValueFilled(RecordString), "&", "?")
+            + "records[]="
+            + OPI_Tools.NumberToString(Record);    
+    EndDo;
+    
+    URL        = "https://api.airtable.com/v0/" + Base + "/" + Table + RecordString;
+    Headers  = GetAuthorizationHeader(Token);
+
+    Response = OPI_Tools.Delete(URL, , Headers);
+    
+    Return Response;    
+       
+EndFunction
+
+#EndRegion
+
+#Region CommentManagement
+
+// Get comments
+// Gets the list of comments for a record in the table
+// 
+// Parameters:
+//  Token   - String - Token                                                         - token
+//  Base    - String - Database identifier                                     - base
+//  Table - String - Table identifier                                         - table
+//  Record  - String - Record identifier in the table                                - record
+//  Indent  - String - Next page identifier of data from the previous request - offset
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function GetComments(Val Token, Val Base, Val Table, Val Record, Val Indent = "") Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetLine(Record);
+    
+    URL        = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record + "/comments";
+    Headers  = GetAuthorizationHeader(Token);
+     
+    Parameters  = New Structure();
+    OPI_Tools.AddField("offset", Indent, "String", Parameters);
+        
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Create comment
+// Creates a comment for a record in the table
+// 
+// Parameters:
+//  Token   - String - Token                           - token
+//  Base    - String - Database identifier       - base
+//  Table - String - Table identifier           - table
+//  Record  - String - Record identifier in the table  - record
+//  Text   - String - Comment text               - text
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function CreateComment(Val Token, Val Base, Val Table, Val Record, Val Text) Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetLine(Record);
+    
+    URL        = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record + "/comments";
+    Headers  = GetAuthorizationHeader(Token);
+     
+    Parameters  = New Structure();
+    OPI_Tools.AddField("text", Text, "String", Parameters);
+        
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Modify comment
+// Changes the text of an existing comment
+// 
+// Parameters:
+//  Token       - String - Token                           - token
+//  Base        - String - Database identifier       - base
+//  Table     - String - Table identifier           - table
+//  Record      - String - Record identifier in the table  - record
+//  Comment - String - Comment identifier       - comment
+//  Text       - String - New comment text         - text
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable
+Function EditComment(Val Token, Val Base, Val Table, Val Record, Val Comment, Val Text) Export
+    
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetLine(Record);
+    OPI_TypeConversion.GetLine(Comment);
+    
+    URL        = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record + "/comments/" + Comment;
+    Headers  = GetAuthorizationHeader(Token);
+     
+    Parameters  = New Structure();
+    OPI_Tools.AddField("text", Text, "String", Parameters);
+        
+    Response = OPI_Tools.Patch(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Delete comment
+// Deletes a comment for a table record
+// 
+// Parameters:
+//  Token       - String - Token                           - token
+//  Base        - String - Database identifier       - base
+//  Table     - String - Table identifier           - table
+//  Record      - String - Record identifier in the table  - record
+//  Comment - String - Comment identifier       - comment
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Airtable 
+Function DeleteComment(Val Token, Val Base, Val Table, Val Record, Val Comment) Export
+
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Table);
+    OPI_TypeConversion.GetLine(Record);
+    OPI_TypeConversion.GetLine(Comment);
+    
+    URL       = "https://api.airtable.com/v0/" + Base + "/" + Table + "/" + Record + "/comments/" + Comment;
+    Headers = GetAuthorizationHeader(Token);
+        
+    Response = OPI_Tools.Delete(URL, , Headers);
+    
+    Return Response;
+        
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function GetAuthorizationHeader(Val Token)
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    Headers = New Match;
+    Headers.Insert("Authorization", "Bearer " + Token);
+    
+    Return Headers;
+    
+EndFunction
+
+Function GenerateTableDescription(Val Name, Val FieldArray, Val Description = "")
+    
+    OPI_TypeConversion.GetLine(Name);
+    OPI_TypeConversion.GetCollection(FieldArray);
+    
+    TableDescription = New Structure("name,fields", Name, FieldArray);
+    
+    OPI_Tools.AddField("description", Description, "String", TableDescription);
+    
+    Return TableDescription;
+    
+EndFunction
+
+Function PrimitiveFieldDescription(Val Name, Val Type, Val Options = "")
+    
+    FieldStructure = New Structure();
+    OPI_Tools.AddField("name"   , Name, "String"   , FieldStructure);
+    OPI_Tools.AddField("type"   , Type         , "String"   , FieldStructure);
+    OPI_Tools.AddField("options", Options       , "Collection", FieldStructure);
+    
+    Return FieldStructure;
+
+EndFunction
+
+Procedure AddDataDescription(Val Data, Parameters)
+    
+    If TypeValue(Data) = Type("Array") Then
+        
+        SendArray = New Array;
+        
+        For Each RecordDescription In Data Do
+            SendArray.Add(New Structure("fields", RecordDescription));    
+        EndDo;
+        
+        OPI_Tools.AddField("records", SendArray, "Array", Parameters);
+        
+    Else
+       
+       OPI_Tools.AddField("fields", Data, "Collection", Parameters); 
+       
+    EndIf;
+        
+EndProcedure
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
new file mode 100644
index 0000000000..a1ecfa6d68
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
new file mode 100644
index 0000000000..8cf5ebb25a
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
@@ -0,0 +1,961 @@
+// Location OS: ./OInt/core/Modules/OPI_Dropbox.os
+// Library: Dropbox
+// CLI Command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region AccountAndAuthorization
+
+// Get authorization link
+// Generates an authorization link for browser transition
+// 
+// Parameters:
+//  AppKey - String - Application key - appkey
+// 
+// Return value:
+//  String - URL for browser transition
+Function GetAuthorizationLink(Val AppKey) Export
+    
+    OPI_TypeConversion.GetLine(AppKey);
+    Return "https://www.dropbox.com/oauth2/authorize?client_id=" 
+        + AppKey 
+        + "&response_type=code&token_access_type=offline";
+    
+EndFunction
+
+// Get token
+// Gets token based on the code from the GetAuthorizationLink page
+// 
+// Parameters:
+//  AppKey   - String - Application key             - appkey
+//  AppSecret - String - Application secret           - appsecret
+//  Code              - String - Code from the authorization page - code
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function GetToken(Val AppKey, Val AppSecret, Val Code) Export
+    
+    URL       = "https://api.dropbox.com/oauth2/token";
+    DataType = "application/x-www-form-urlencoded; charset=utf-8";
+    
+    Parameters = New Structure;                  
+    OPI_Tools.AddField("code"      , Code                 , "String", Parameters);
+    OPI_Tools.AddField("grant_type", "authorization_code", "String", Parameters);
+    
+    URLStructure  = OPI_Tools.SplitURL(URL);
+    Server        = URLStructure["Server"];
+    Address         = URLStructure["Address"];
+    
+    Request        = OPI_Tools.CreateRequest(Address, , DataType);
+    Connection    = OPI_Tools.CreateConnection(Server, AppKey, AppSecret);
+
+    ParameterString = OPI_Tools.RequestParametersToString(Parameters);
+    Data           = Right(ParameterString, StrLength(ParameterString) - 1);
+
+    Request.SetBodyFromString(Data);
+    
+    Response = Connection.CallHTTPMethod("POST", Request);
+    OPI_Tools.ProcessResponse(Response);
+    
+    Return Response;
+    
+EndFunction
+
+// Refresh token
+// Gets a new token based on the refresh token
+// 
+// Parameters:
+//  AppKey   - String - Application key   - appkey
+//  AppSecret - String - Application secret - appsecret
+//  RefreshToken      - String - Refresh token      - refresh
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function RefreshToken(Val AppKey, Val AppSecret, Val RefreshToken) Export
+    
+    String_ = "String";
+    URL     = "https://api.dropbox.com/oauth2/token";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("refresh_token", RefreshToken     , String_, Parameters);
+    OPI_Tools.AddField("grant_type"   , "refresh_token" , String_, Parameters);
+    OPI_Tools.AddField("client_id"    , AppKey  , String_, Parameters);
+    OPI_Tools.AddField("client_secret", AppSecret, String_, Parameters);
+    
+    Response = OPI_Tools.Post(URL, Parameters, , False);
+    
+    Return Response;
+    
+EndFunction
+
+// Get account information
+// Gets account information
+// 
+// Parameters:
+//  Token   - String - Token                                                  - token
+//  Account - String - Account ID. Current token account if not filled - account
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function GetAccountInformation(Val Token, Val Account = "") Export
+    
+    If ValueFilled(Account) Then
+        Result = GetAccount(Token, Account);
+    Else
+        Result = GetOwnAccount(Token);
+    EndIf;
+    
+    Return Result;
+    
+EndFunction
+
+// Get space usage data
+// Gets information on the amount of used disk space
+// 
+// Parameters:
+//  Token - String - Token - token 
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function GetSpaceUsageData(Val Token) Export
+    
+    URL       = "https://api.dropboxapi.com/2/users/get_space_usage";
+    Headers = GetRequestHeaders(Token);
+    
+    Response = OPI_Tools.PostBinary(URL
+        , GetBinaryDataFromString("null")
+        , Headers
+        , 
+        , "text/plain; charset=dropbox-cors-hack"); 
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region FileAndDirectoryManagement
+
+// Get object information
+// Gets information about a file or directory
+// 
+// Parameters:
+//  Token    - String - Token                                                    - token
+//  Path     - String - Path to the object                                           - path
+//  Detailed - Boolean - Adds additional information fields for media files - detail 
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox 
+Function GetObjectInformation(Val Token, Val Path, Val Detailed = False) Export
+    
+    URL = "https://api.dropboxapi.com/2/files/get_metadata"; 
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("path"              , Path    , "String", Parameters);
+    OPI_Tools.AddField("include_media_info", Detailed, "Boolean", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get list of folder files
+// Gets the list of the first files in the directory or continues getting the next ones when the cursor is specified
+// 
+// Parameters:
+//  Token    - String - Token                                                                - token
+//  Path     - String - Path to the directory. Optional if the cursor is specified                    - path
+//  Detailed - Boolean - Adds additional information fields for media files             - detail
+//  Cursor   - String - Cursor from the previous request to get the next set of files - cursor
+// 
+// Return value:
+//  HTTPResponse - Get list of folder files
+Function GetListOfFolderFiles(Val Token, Val Path = "", Val Detailed = False, Val Cursor = "") Export
+    
+    If Not ValueFilled(Cursor) Then
+        
+        URL = "https://api.dropboxapi.com/2/files/list_folder";
+        
+        Parameters = New Structure;
+        OPI_Tools.AddField("path"              , Path      , "String", Parameters);
+        OPI_Tools.AddField("include_media_info", Detailed  , "Boolean", Parameters);
+    
+    Else
+        
+        URL = "https://api.dropboxapi.com/2/files/list_folder/continue";
+        
+        Parameters = New Structure;
+        OPI_Tools.AddField("cursor", Cursor, "String", Parameters); 
+        
+    EndIf;
+    
+    Headers = GetRequestHeaders(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get preview
+// Forлучает PDF or HTML преinью объеtoта (тольtoо for тоtoументоin)
+// 
+// Parameters:
+//  Token - String - Token          - token
+//  Path  - String - Path to the object - path
+// 
+// Return value:
+//  BinaryData - document preview 
+Function GetPreview(Val Token, Val Path) Export
+    
+    URL   = "https://content.dropboxapi.com/2/files/get_preview";
+    Response = ProcessObject(Token, URL, Path, True);
+    
+    Return Response;
+    
+EndFunction
+
+// Upload file
+// Uploads a file to the cloud drive
+// 
+// Parameters:
+//  Token          - String                 - Token                                   - token
+//  File           - String, BinaryData - Data file for upload                - file
+//  Path           - String                 - Save path on Dropbox              - path
+//  Overwrite - Boolean                 - Overwrite file in case of path conflicts - overwrite
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox 
+Function UploadFile(Val Token, Val File, Val Path, Val Overwrite = False) Export
+    
+    OPI_TypeConversion.GetBinaryData(File);
+    OPI_TypeConversion.GetBoolean(Overwrite);
+    OPI_TypeConversion.GetLine(Path);
+    
+    Mode     = ?(Overwrite, "overwrite", "add");
+    Size    = File.Size();
+    Boundary   = 100000000;
+        
+    If Size > Boundary Then
+        Response = UploadLargeFile(Token, File, Path, Mode);
+    Else
+        Response = UploadSmallFile(Token, File, Path, Mode);
+    EndIf;
+    
+    Return Response;
+    
+EndFunction
+
+// Upload file by URL
+// Uploads a file to the cloud drive by fetching it from the specified URL 
+// 
+// Parameters:
+//  Token    - String - Token                      - token
+//  FileURL - String - URL source of the file         - url
+//  Path     - String - Save path on Dropbox - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function UploadFileByURL(Val Token, Val FileURL, Val Path) Export
+    
+    URL = "https://api.dropboxapi.com/2/files/save_url"; 
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("path", Path     , "String", Parameters);
+    OPI_Tools.AddField("url" , FileURL , "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get upload status by URL
+// Gets the upload status of the file by URL
+// 
+// Parameters:
+//  Token    - String - Token                                              - token
+//  JobID - String - ID of the asynchronous job from the UploadFileByURL response - job 
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function GetUploadStatusByURL(Val Token, Val JobID) Export
+    
+    URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status"; 
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("async_job_id", JobID, "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Delete object
+// Deletes an object from the cloud drive
+// 
+// Parameters:
+//  Token        - String - Token                                        - token
+//  Path         - String - Path to the object to delete                      - path
+//  Irrecoverable - String - Delete object without the possibility of recovery - permanently
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function DeleteObject(Val Token, Val Path, Val Irretrievably = False) Export
+    
+    OPI_TypeConversion.GetBoolean(Irretrievably);
+    
+    If Irretrievably Then
+        URL = "https://api.dropboxapi.com/2/files/permanently_delete";
+    Else
+        URL = "https://api.dropboxapi.com/2/files/delete_v2";
+    EndIf;
+    
+    Response = ProcessObject(Token, URL, Path);
+    
+    Return Response;
+
+EndFunction
+
+// Copy object
+// Copies a file or directory to the selected path
+// 
+// Parameters:
+//  Token  - String - Token                           - token
+//  From - String - Path to the original object        - form
+//  To   - String - Target path for the new object - to
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function CopyObject(Val Token, Val From, Val To) Export
+   
+    URL = "https://api.dropboxapi.com/2/files/copy_v2";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("from_path", From, "String", Parameters);
+    OPI_Tools.AddField("to_path"  , To  , "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+     
+EndFunction
+
+// Move object
+// Moves an object to the selected path
+// 
+// Parameters:
+//  Token  - String - Token                           - token
+//  From - String - Path to the original object        - form
+//  To   - String - Target path for the new object - to
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function MoveObject(Val Token, Val From, Val To) Export
+
+    URL = "https://api.dropboxapi.com/2/files/move_v2";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("from_path", From, "String", Parameters);
+    OPI_Tools.AddField("to_path"  , To  , "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+        
+EndFunction
+
+// Create folder
+// Creates an empty directory at the selected path
+// 
+// Parameters:
+//  Token - String - Token                          - token
+//  Path  - String - Target path for creating the directory - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function CreateFolder(Val Token, Val Path) Export
+    
+    URL   = "https://api.dropboxapi.com/2/files/create_folder_v2";
+    Response = ProcessObject(Token, URL, Path);
+    
+    Return Response;
+     
+EndFunction
+
+// Download file
+// Downloads a file by the specified path or ID
+// 
+// Parameters:
+//  Token - String - Token             - token
+//  Path  - String - Path or ID of the file - path
+// 
+// Return value:
+//  BinaryData - binary data of the file
+Function DownloadFile(Val Token, Val Path) Export
+    
+    URL   = "https://content.dropboxapi.com/2/files/download";
+    Response = ProcessObject(Token, URL, Path, True);
+    
+    Return Response;
+    
+EndFunction
+
+// Download folder
+// Downloads a zip archive with the contents of the specified directory
+// 
+// Parameters:
+//  Token - String - Token                - token
+//  Path  - String - Path or ID of the directory - path
+// 
+// Return value:
+//  BinaryData - binary data of the zip archive with the contents of the directory
+Function DownloadFolder(Val Token, Val Path) Export
+    
+    URL   = "https://content.dropboxapi.com/2/files/download_zip";
+    Response = ProcessObject(Token, URL, Path, True);
+    
+    Return Response;
+    
+EndFunction
+
+// Get list of object versions
+// Gets the list of versions (revisions) of the object
+// 
+// Parameters:
+//  Token      - String        - Token                                          - token
+//  Path       - String        - Path to the object                                 - path
+//  Quantity - String, Number - Number of the latest versions of the object to display - amount
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function GetObjectVersionList(Val Token, Val Path, Val Quantity = 10) Export
+    
+    URL = "https://api.dropboxapi.com/2/files/list_revisions"; 
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("path" , Path      , "String", Parameters);
+    OPI_Tools.AddField("limit", Quantity, "Number" , Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Restore object to version
+// Inоwithwithтаtoinлиinает withоwithтояние объеtoта to необхоdимой inерwithии (реinfromии)
+// 
+// Parameters:
+//  Token  - String - Token                                 - token
+//  Path   - String - Path to the object                        - path
+//  Version - String - ID of the version (revision) for restoration - rev
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function RestoreObjectToVersion(Val Token, Val Path, Val Version) Export
+    
+    URL = "https://api.dropboxapi.com/2/files/restore"; 
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("path", Path  , "String", Parameters);
+    OPI_Tools.AddField("rev" , Version, "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region TagWork
+
+// Get list of tags
+// Gets the list of tags of the selected files
+// 
+// Parameters:
+//  Token - String                   - Token                          - token
+//  Paths  - String, Array of Strings - Path or set of paths to the files - paths
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function GetTagList(Val Token, Val Paths) Export
+    
+    URL = "https://api.dropboxapi.com/2/files/tags/get";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("paths", Paths, "Array", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Add tag
+// Adds a new text tag to a file or directory
+// 
+// Parameters:
+//  Token - String - Token                                               - token
+//  Path  - String - Path to the object for which the tag needs to be created - path
+//  Tag   - String - Tag text                                          - tag
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function AddTag(Val Token, Val Path, Val Tag) Export
+    
+    Return ProcessTag(Token, Path, Tag);
+    
+EndFunction
+
+// Delete tag
+// Deletes the text tag of a file or directory
+// 
+// Parameters:
+//  Token - String - Token                                           - token
+//  Path  - String - Path to the object whose tag needs to be deleted - path
+//  Tag   - String - Tag text                                      - tag
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function DeleteTag(Val Token, Val Path, Val Tag) Export
+    
+    Return ProcessTag(Token, Path, Tag, True);
+    
+EndFunction
+
+#EndRegion
+
+#Region SharedAccessSettings
+
+// Publish folder
+// Sets the directory to public access mode
+// 
+// Parameters:
+//  Token - String - Token                    - token
+//  Path  - String - Path to the target directory - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function PublishFolder(Val Token, Val Path) Export
+    
+    URL   = "https://api.dropboxapi.com/2/sharing/share_folder";
+    Response = ProcessObject(Token, URL, Path);
+    
+    Return Response;
+    
+EndFunction
+
+// Unpublish folder
+// Cancels the public access mode for the directory
+// 
+// Parameters:
+//  Token   - String - Token                                     - token
+//  FolderID - String - ID публичного directory (shared folder ID) - folder
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function CancelFolderPublication(Val Token, Val FolderID) Export
+    
+    URL = "https://api.dropboxapi.com/2/sharing/unshare_folder";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("shared_folder_id", FolderID, "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+
+    Return Response;
+
+EndFunction
+
+// Add user to file
+// Defines access to the file for an external user
+// 
+// Parameters:
+//  Token          - String                   - Token                                                      - token
+//  FileID        - String                   - ID of the file to be accessed                - fileid
+//  EmailAddresses    - String, Array of Strings - List of email addresses of users being added             - emails
+//  ViewOnly - Boolean                   - Prohibits file editing for the external user - readonly
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function AddUsersToFile(Val Token, Val FileID, Val EmailAddresses, Val ViewOnly = True) Export
+    
+    String_ = "String";
+    
+    OPI_TypeConversion.GetArray(EmailAddresses);
+    OPI_TypeConversion.GetLine(FileID);
+    OPI_TypeConversion.GetBoolean(ViewOnly);
+    
+    If Not StringStartsWith(FileID, "id:") Then
+        FileID = "id:" + FileID;
+    EndIf;
+    
+    URL = "https://api.dropboxapi.com/2/sharing/add_file_member";
+    
+    ArrayOfUsers = New Array;
+    
+    For Each Address In EmailAddresses Do
+             
+        UserData = New Match;
+        OPI_Tools.AddField(".tag" , "email", String_, UserData);
+        OPI_Tools.AddField("email", Address  , String_, UserData);
+        
+        ArrayOfUsers.Add(UserData);
+
+    EndDo;
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("file"   , FileID             , String_, Parameters);
+    OPI_Tools.AddField("members", ArrayOfUsers , "Array", Parameters);
+    
+    Mode = ?(ViewOnly, "viewer", "editor");
+    
+    OPI_Tools.AddField("access_level", Mode , String_, Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Add users to folder
+// Grants external users access to the directory
+// 
+// Parameters:
+//  Token          - String - Token                                                            - token
+//  FolderID        - String - ID публичного directory (shared folder ID)                        - folder
+//  EmailAddresses    - String, Array of Strings - List of email addresses of users being added - emails
+//  ViewOnly - Boolean - Prohibits file editing for the external user       - readonly
+// 
+// Return value:
+//  Undefined - empty response
+Function AddUsersToFolder(Val Token, Val FolderID, Val EmailAddresses, Val ViewOnly = True) Export
+    
+    String_ = "String";
+    
+    OPI_TypeConversion.GetArray(EmailAddresses);
+    OPI_TypeConversion.GetBoolean(ViewOnly);
+    Mode = ?(ViewOnly, "viewer", "editor");
+        
+    URL = "https://api.dropboxapi.com/2/sharing/add_folder_member";
+    
+    ArrayOfUsers = New Array;
+    
+    For Each Address In EmailAddresses Do
+             
+        UserData = New Match;
+        OPI_Tools.AddField(".tag" , "email", String_, UserData);
+        OPI_Tools.AddField("email", Address  , String_, UserData);
+        
+        UserStructure = New Structure("member,access_level", UserData, Mode); 
+        
+        ArrayOfUsers.Add(UserStructure);
+
+    EndDo;
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("shared_folder_id", FolderID             , String_, Parameters);
+    OPI_Tools.AddField("members"         , ArrayOfUsers , "Array", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get asynchronous change status
+// Gets the status of the asynchronous access change job
+// 
+// Parameters:
+//  Token    - String - Token                 - token
+//  JobID - String - AsynchronousJobID - job
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function GetAsynchronousChangeStatus(Val Token, Val JobID) Export
+    
+    URL = "https://api.dropboxapi.com/2/sharing/check_job_status";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("async_job_id", JobID, "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+
+    Return Response;
+
+EndFunction
+
+// Unpublish file
+// Prohibits access to the file for external users
+// 
+// Parameters:
+//  Token    - String - Token                                       - token
+//  FileID  - String - ID of the file to be accessed - fileid
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Dropbox
+Function CancelFilePublication(Val Token, Val FileID) Export
+	
+	OPI_TypeConversion.GetLine(FileID);
+    
+    If Not StringStartsWith(FileID, "id:") Then
+        FileID = "id:" + FileID;
+    EndIf;
+    
+	URL = "https://api.dropboxapi.com/2/sharing/unshare_file";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("file", FileID, "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function ProcessObject(Val Token, Val URL, Val Path, Val InHeaders = False)
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("path", Path, "String", Parameters);
+    
+    If InHeaders Then
+        Headers = GetRequestHeaders(Token, Parameters);
+        Response     = OPI_Tools.PostBinary(URL, GetBinaryDataFromString(""), Headers);
+    Else
+        Headers = GetRequestHeaders(Token);
+        Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    EndIf;
+    
+    Return Response;
+    
+EndFunction
+
+Function ProcessTag(Val Token, Val Path, Val Tag, Val ThisIsDeletion = False)
+
+    If ThisIsDeletion Then
+        URL = "https://api.dropboxapi.com/2/files/tags/remove";
+    Else
+        URL = "https://api.dropboxapi.com/2/files/tags/add";
+    EndIf;
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("path"     , Path, "String", Parameters);
+    OPI_Tools.AddField("tag_text" , Tag , "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+        
+EndFunction
+
+Function GetRequestHeaders(Val Token, Val Parameters = "")
+    
+    OPI_TypeConversion.GetLine(Token);
+        
+    Headers = New Match;
+    Headers.Insert("Authorization"  , "Bearer " + Token);
+    
+    If ValueFilled(Parameters) Then
+        
+        JSON = OPI_Tools.JSONString(Parameters, "No");
+        JSON = StringReplace(JSON, Symbols.VK + Symbols.PS, "");
+
+        Headers.Insert("Dropbox-API-Arg", JSON);
+    
+    EndIf;
+    
+    Return Headers;
+    
+EndFunction
+
+Function UploadLargeFile(Val Token, Val File, Val Path, Val Mode)
+    
+    URL            = "https://content.dropboxapi.com/2/files/upload_session/append_v2"; 
+
+    ChunkSize    = 100000000;
+    CurrentPosition = 0;
+    BytesRead  = 0;
+    TotalSize    = File.Size();   
+    Session         = OpenSession(Token);
+    
+    WHile BytesRead < TotalSize Do
+        
+        Indent = CurrentPosition;
+        Cursor = New Structure("offset,session_id", Indent, Session);
+        
+        Parameters = New Structure("cursor", Cursor);
+        Headers = GetRequestHeaders(Token, Parameters);
+        
+        ReadingData     = New ReadingData(File);
+        BytesRead    = ReadingData.Skip(CurrentPosition);
+        Result        = ReadingData.Read(ChunkSize);
+        Current data    = Result.GetBinaryData();
+        CurrentSize    = Current data.Size();
+        NextPosition = CurrentPosition + CurrentSize; 
+        
+        If Not ValueFilled(Current data) Then
+            Break;
+        EndIf;
+
+        Response = OPI_Tools.PostBinary(URL, Current data, Headers);
+        
+        CurrentPosition = NextPosition;
+        
+        // !OInt KBytes = 1024;
+        // !OInt MByte = KBytes * KBytes;
+        // !OInt Notify(OPI_Tools.ProgressInformation(CurrentPosition, TotalSize, "MB", MByte));
+        
+        // !OInt PerformGarbageCollection();
+        // !OInt ReleaseObject(Current data);
+               
+    EndDo;
+    
+    Response = CloseSession(Token, Path, Mode, TotalSize, Session);
+    
+    Return Response;
+        
+EndFunction
+
+Function UploadSmallFile(Val Token, Val File, Val Path, Val Mode)
+    
+    Boolean_ = "Boolean";
+    String_ = "String";
+    URL     = "https://content.dropboxapi.com/2/files/upload";
+    
+    Parameters = New Structure;
+        
+    OPI_Tools.AddField("autorename"     , False , Boolean_, Parameters);
+    OPI_Tools.AddField("mode"           , Mode, String_, Parameters);
+    OPI_Tools.AddField("mute"           , False , Boolean_, Parameters);
+    OPI_Tools.AddField("path"           , Path , String_, Parameters);
+    OPI_Tools.AddField("strict_conflict", False , Boolean_, Parameters);
+    
+    Headers = GetRequestHeaders(Token, Parameters);
+
+    Response = OPI_Tools.PostBinary(URL, File, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+Function OpenSession(Val Token)
+    
+    SessionId = "session_id";
+    URL       = "https://content.dropboxapi.com/2/files/upload_session/start";
+    Headers = GetRequestHeaders(Token);
+    
+    Response = OPI_Tools.PostBinary(URL, GetBinaryDataFromString(""), Headers); 
+    
+    Return Response[SessionId];
+    
+EndFunction
+
+Function CloseSession(Val Token, Val Path, Val Mode, Val TotalSize, Val Session)
+
+    URL = "https://content.dropboxapi.com/2/files/upload_session/finish";
+    
+    Commit = New Structure();
+    OPI_Tools.AddField("mode", Mode, "String", Commit);
+    OPI_Tools.AddField("path", Path, "String", Commit);   
+    
+    Cursor = New Structure("offset,session_id", TotalSize, Session);
+     
+    Parameters = New Structure("commit,cursor", Commit, Cursor);
+    Headers = GetRequestHeaders(Token, Parameters);
+    
+    Response = OPI_Tools.PostBinary(URL, GetBinaryDataFromString(""), Headers);
+    
+    Return Response;
+    
+EndFunction
+
+Function GetAccount(Val Token, Val Account)
+    
+    URL = "https://api.dropboxapi.com/2/users/get_account";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("account_id", Account, "String", Parameters);
+    
+    Headers = GetRequestHeaders(Token);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+        
+EndFunction
+
+Function GetOwnAccount(Val Token)
+    
+    URL       = "https://api.dropboxapi.com/2/users/get_current_account";
+    Headers = GetRequestHeaders(Token);
+    
+    Response = OPI_Tools.PostBinary(URL
+        , GetBinaryDataFromString("null")
+        , Headers
+        , 
+        , "text/plain; charset=dropbox-cors-hack"); 
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
new file mode 100644
index 0000000000..fb078b30c9
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
new file mode 100644
index 0000000000..bc9071245d
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
@@ -0,0 +1,631 @@
+// Location OS: ./OInt/core/Modules/OPI_GoogleCalendar.os
+// Library: Google Calendar
+// CLI Command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region CalendarMetadataManagement
+
+// Create calendar
+// Creates an empty calendar
+// 
+// Parameters:
+//  Token        - String - Token                                - token
+//  Name - String - Name of the created calendar  - title
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function CreateCalendar(Val Token, Val Name) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Name);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars";
+    
+    Parameters = New Structure;
+    Parameters.Insert("summary" , Name);
+    Parameters.Insert("timeZone", "Europe/Moscow");
+    
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get calendar
+// Gets calendar information by ID
+// 
+// Parameters:
+//  Token     - String - Token        - token
+//  Calendar - String - Calendar ID - calendar
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetCalendarMetadata(Val Token, Val Calendar) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Calendar;    
+    Response     = OPI_Tools.Get(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Edit calendar
+// Edits properties of an existing calendar
+// 
+// Parameters:
+//  Token        - String - Token                      - token
+//  Calendar    - String - Calendar ID               - calendar
+//  Name - String - New name         - title
+//  Description     - String - New calendar description   - description
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function EditCalendarMetadata(Val Token
+    , Val Calendar
+    , Val Name = ""
+    , Val Description = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    OPI_TypeConversion.GetLine(Name);
+    OPI_TypeConversion.GetLine(Description);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Calendar;
+    
+    Parameters = New Structure;
+    
+    If ValueFilled(Name) Then
+        Parameters.Insert("summary", Name);
+    EndIf;
+    
+    If ValueFilled(Description) Then
+        Parameters.Insert("description", Description);
+    EndIf;
+      
+    Response = OPI_Tools.Patch(URL, Parameters, Headers, True);
+    
+    Return Response;
+
+EndFunction
+
+// Clear primary calendar
+// Clears the event list of the primary calendar
+// 
+// Parameters:
+//  Token - String - Token - token
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function ClearMainCalendar(Val Token) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars/primary/clear";    
+    Response     = OPI_Tools.Post(URL, , Headers, False);
+    
+    Return Response;
+
+EndFunction
+
+// Delete calendar
+// Deletes a calendar by ID
+// 
+// Parameters:
+//  Token     - String - Token         - token
+//  Calendar - String - Calendar ID  - calendar
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function DeleteCalendar(Val Token, Val Calendar) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Calendar;       
+    Response     = OPI_Tools.Delete(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region CalendarListManagement
+
+// Get list of calendars
+// Gets an array of account calendars
+// 
+// Parameters:
+//  Token - String - Token - token
+// 
+// Return value:
+//  Key-Value Pair - Array of calendar data mappings
+Function GetCalendarList(Val Token) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    Headers        = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    ArrayOfCalendars = New Array;
+    
+    GetCalendarsListRecursively(Headers, ArrayOfCalendars);
+    
+    Return ArrayOfCalendars;
+    
+EndFunction
+
+// Add calendar to list
+// Adds an existing calendar to the user's list
+// 
+// Parameters:
+//  Token     - String - Token        - token
+//  Calendar - String - Calendar ID - calendar
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function AddCalendarToList(Val Token, Val Calendar) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList";
+    
+    Parameters = New Structure;
+    Parameters.Insert("id", Calendar);
+    
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get list calendar
+// Gets a calendar from the user's list by ID
+// 
+// Parameters:
+//  Token     - String - Token        - token
+//  Calendar - String - Calendar ID - calendar
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetListCalendar(Val Token, Val Calendar) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Calendar;
+    Response     = OPI_Tools.Get(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Remove calendar from list
+// Removes a calendar from the user's list
+// 
+// Parameters:
+//  Token     - String - Token         - token
+//  Calendar - String - Calendar ID  - calendar
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function DeleteCalendarFromList(Val Token, Val Calendar) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Calendar;
+    Response     = OPI_Tools.Delete(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Edit list calendar
+// Edits the properties of a calendar from the user's list
+// 
+// Parameters:
+//  Token              - String - Token                                   - token
+//  Calendar          - String - Calendar ID                            - calendar
+//  PrimaryColor       - String - HEX mainоinного цinета (#ffffff)           - primary
+//  SecondaryColor - String - HEX addолнительного цinета (#ffffff)     - secondary
+//  Hidden            - Boolean - Hidden calendar                       - hidden
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function EditListCalendar(Val Token
+    , Val Calendar
+    , Val PrimaryColor
+    , Val SecondaryColor
+    , Val Hidden = False) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    OPI_TypeConversion.GetLine(PrimaryColor);
+    OPI_TypeConversion.GetLine(SecondaryColor);
+    OPI_TypeConversion.GetBoolean(Hidden);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Calendar + "?colorRgbFormat=true";
+    
+    Parameters = New Match;
+    Parameters.Insert("hidden"         , Hidden);
+    Parameters.Insert("foregroundColor", PrimaryColor);
+    Parameters.Insert("backgroundColor", SecondaryColor);
+    
+    Response = OPI_Tools.Put(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region EventManagement
+
+// Get event description !NOCLI
+// 
+// Return value:
+// Key-Value Pair - Empty event template
+Function GetEventDescription() Export
+    
+    CurrentDate = OPI_Tools.GetCurrentDate();
+    Hour         = 3600;
+    Event     = New Match;
+                       
+    Event.Insert("Description"               , "");                          // Event description
+    Event.Insert("Title"              , "New event");             // Title events
+    Event.Insert("Venue"        , "");                          // String description of the venue of the event
+    Event.Insert("StartDate"             , CurrentDate);                 // Date of start events
+    Event.Insert("EndDate"          , CurrentDate + Hour);           // Date of end events
+    Event.Insert("ArrayOfAttachmentURLs", New Match);          // Key - name, Value - URL to file
+    Event.Insert("SendNotifications"  , True);                      // Indication of sending notifications to participants
+
+    Return Event;
+    
+EndFunction
+
+// Get list of events
+// Gets the list of all calendar events
+// 
+// Parameters:
+//  Token     - String - Token         - token
+//  Calendar - String - Calendar ID  - calendar
+// 
+// Return value:
+//  Key-Value Pair - Array of event mappings
+Function GetEventList(Val Token, Val Calendar) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    
+    Headers     = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    ArrayOfEvents = New Array;
+    
+    GetEventsListRecursively(Headers, Calendar, ArrayOfEvents);
+    
+    Return ArrayOfEvents;
+    
+EndFunction
+
+// Get event
+// Gets an event by ID
+// 
+// Parameters:
+//  Token     - String - Token        - token
+//  Calendar - String - Calendar ID - calendar
+//  Event   - String - Event ID   - event
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetEvent(Val Token, Val Calendar, Val Event) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    OPI_TypeConversion.GetLine(Event);
+    
+    Headers   = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
+        + Calendar 
+        + "/events/"
+        + Event; 
+        
+    Response = OPI_Tools.Get(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Create event
+// Creates a new event
+// 
+// Parameters:
+//  Token           - String                        - Token            - token         
+//  Calendar       - String                        - Calendar ID     - calendar
+//  EventDescription - Key-Value Pair - Event description - props
+// 
+// Return value:
+//  String, Arbitrary, HTTPResponse, BinaryData, Undefined - Google server response
+Function CreateEvent(Val Token, Val Calendar, Val EventDescription) Export    
+    Return EventManagement(Token, Calendar, EventDescription);
+EndFunction
+
+// Move event
+// Moves an event to another calendar
+// 
+// Parameters:
+//  Token             - String - Token                            - token
+//  SourceCalendar - String - ID of the source calendar           - from
+//  TargetCalendar - String - ID of the target calendar           - to
+//  Event           - String - ID of the source calendar event   - event
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function MoveEvent(Val Token, Val SourceCalendar, Val TargetCalendar, Val Event) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(SourceCalendar);
+    OPI_TypeConversion.GetLine(TargetCalendar);
+    OPI_TypeConversion.GetLine(Event);
+    
+    Headers   = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
+        + SourceCalendar 
+        + "/events/"
+        + Event
+        + "/move?destination="
+        + TargetCalendar; 
+        
+    Response = OPI_Tools.Post(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Edit event
+// Edits an existing event
+// 
+// Parameters:
+//  Token           - String - Token                    - token
+//  Calendar       - String - Calendar ID             - calendar
+//  EventDescription - String - New event description   - props
+//  Event         - String - Event ID               - event
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function EditEvent(Val Token, Val Calendar, Val EventDescription, Val Event) Export
+    Return EventManagement(Token, Calendar, EventDescription, Event);
+EndFunction
+
+// Delete event
+// Deletes an event by ID
+// 
+// Parameters:
+//  Token     - String - Token         - token
+//  Calendar - String - Calendar ID  - calendar
+//  Event   - String - Event ID    - event
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function DeleteEvent(Val Token, Val Calendar, Val Event) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    OPI_TypeConversion.GetLine(Event);
+    
+    Headers   = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
+        + Calendar 
+        + "/events/"
+        + Event; 
+        
+    Response = OPI_Tools.Delete(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function ConvertDate(Val Date)
+    
+    OPI_TypeConversion.GetDate(Date);
+    
+    DateStructure = New Structure;
+    
+    If Not TypeValue(Date) = Type("Date") Then
+        Return Undefined;
+    EndIf;
+    
+    If Date = StartOfDay(Date) Then
+        DateFormat = "DF=yyyy-MM-dd";
+        Field       = "date";
+    Else
+        DateFormat = "DF=yyyy-MM-ddTHH:mm:ssZ";
+        Field       = "dateTime";
+    EndIf;
+    
+    Date = Format(Date, DateFormat);
+    DateStructure.Insert(Field      , Date);
+    DateStructure.Insert("timeZone", "Europe/Moscow");
+    
+    Return DateStructure;
+    
+EndFunction
+
+Function ConvertAttachments(Val Attachments)
+    
+    OPI_TypeConversion.GetCollection(Attachments);
+    
+    AttachmentsArray = New Array;
+    
+    If TypeValue(Attachments) = Type("Match") Or TypeValue(Attachments) = Type("Structure") Then
+        
+        For Each Attachment In Attachments Do
+            
+            CurrentAttachment = New Structure;
+            CurrentAttachment.Insert("title"  , Attachment.Key);
+            CurrentAttachment.Insert("fileUrl", Attachment.Value);
+            
+            AttachmentsArray.Add(CurrentAttachment);
+            
+        EndDo;
+        
+    EndIf;
+    
+    If AttachmentsArray.Quantity() > 0 Then
+        Return AttachmentsArray;
+    Else
+        Return Undefined;
+    EndIf;
+
+EndFunction
+
+Function EventManagement(Val Token, Val Calendar, Val EventDescription, Val Event = "")
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Calendar);
+    OPI_TypeConversion.GetLine(Event);
+    OPI_TypeConversion.GetCollection(EventDescription);
+    
+    Headers    = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    Existing = ValueFilled(Event);
+    URL          = "https://www.googleapis.com/calendar/v3/calendars/" 
+        + Calendar 
+        + "/events"
+        + ?(Existing, "/" + Event, ""); 
+    
+    Date0       = EventDescription["StartDate"];
+    Date1       = EventDescription["EndDate"];
+    Attachments    = EventDescription["ArrayOfAttachmentURLs"];
+    Attachments    = ConvertAttachments(Attachments);
+    Notifications = ?(EventDescription["SendNotifications"] = Undefined
+        , False
+        , EventDescription["SendNotifications"]);
+        
+    Parameters   = New Structure;
+    Parameters.Insert("summary"    , EventDescription["Title"]);
+    Parameters.Insert("description", EventDescription["Description"]);
+    Parameters.Insert("location"   , EventDescription["Venue"]);
+    Parameters.Insert("start"      , ConvertDate(Date0));
+    Parameters.Insert("end"        , ConvertDate(Date1));
+    Parameters.Insert("attachments", Attachments);  
+    
+    URLParameters = New Structure;    
+    URLParameters.Insert("sendUpdates"         , ?(Notifications, "all", "none"));
+    URLParameters.Insert("supportsAttachments" , ?(ValueFilled(Attachments), "true", "false"));
+    
+    URL   = URL + OPI_Tools.RequestParametersToString(URLParameters);
+    
+    OPI_Tools.RemoveEmptyCollectionFields(Parameters);
+    
+    If Existing Then
+        Response = OPI_Tools.Patch(URL, Parameters, Headers, True);
+    Else
+        Response = OPI_Tools.Post(URL, Parameters, Headers, True);
+    EndIf;
+    
+    Return Response;
+
+EndFunction
+
+Procedure GetCalendarsListRecursively(Val Headers, ArrayOfCalendars, Page = "") 
+    
+    Items     = "items";
+    NPT       = "nextPageToken";
+    Parameters = New Structure;
+    
+    If ValueFilled(Page) Then
+        Parameters.Insert("pageToken", Page);
+    EndIf;
+    
+    Result = OPI_Tools.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList"
+        , Parameters
+        , Headers);
+        
+    Calendars = Result[Items];
+    Page  = Result[NPT];
+        
+    For Each Calendar In Calendars Do
+        ArrayOfCalendars.Add(Calendar);    
+    EndDo;    
+    
+    If Calendars.Quantity() > 0 And ValueFilled(Page) Then
+        GetCalendarsListRecursively(Headers, ArrayOfCalendars, Page); 
+    EndIf;
+          
+EndProcedure
+
+Procedure GetEventsListRecursively(Val Headers, Val Calendar, ArrayOfEvents, Page = "") 
+    
+    Items     = "items";
+    NPT       = "nextPageToken";
+    Parameters = New Structure;
+    
+    If ValueFilled(Page) Then
+        Parameters.Insert("pageToken", Page);
+    EndIf;
+    
+    Result = OPI_Tools.Get("https://www.googleapis.com/calendar/v3/calendars/" + Calendar + "/events"
+        , Parameters
+        , Headers);
+        
+    Events  = Result[Items];
+    Page = Result[NPT];
+        
+    For Each Event In Events Do
+        ArrayOfEvents.Add(Event);    
+    EndDo;    
+    
+    If Events.Quantity() > 0 And ValueFilled(Page) Then
+        GetEventsListRecursively(Headers, ArrayOfEvents, Page); 
+    EndIf;
+          
+EndProcedure
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo b/service/interim/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
new file mode 100644
index 0000000000..aefdff4c4f
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
new file mode 100644
index 0000000000..4e775dd3a3
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
@@ -0,0 +1,719 @@
+// Location OS: ./OInt/core/Modules/OPI_GoogleDrive.os
+// Library: Google Drive
+// CLI Command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region FileAndDirectoryManagement
+
+// Get object information
+// Gets information about a folder or file by ID
+// 
+// Parameters:
+//  Token         - String - Token                            - token
+//  Identifier - String - Identifier of the file or folder - object
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetObjectInformation(Val Token, Val Identifier) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Identifier);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Identifier; 
+    
+    Parameters = New Structure;
+    Parameters.Insert("fields", "*");
+    
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get list of directories
+// Gets the list of drive directories
+// 
+// Parameters:
+//  Token       - String - Token                                     - token
+//  NameContains - String - Filter by name                            - querry
+//  Detailed    - Boolean - Adds a list of files to the directory fields  - depth
+// 
+// Return value:
+//  Key-Value Pair - Array of directory mappings
+Function GetDirectoriesList(Val Token, Val NameContains = "", Val Detailed = False) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(NameContains);
+    OPI_TypeConversion.GetBoolean(Detailed);
+    
+    Headers      = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    ArrayOfObjects = New Array;
+    Filter          = New Array;
+    
+    Filter.Add("mimeType = 'application/vnd.google-apps.folder'");
+    
+    If ValueFilled(NameContains) Then
+        Filter.Add("name contains '" + NameContains + "'");
+    EndIf;
+    
+    GetObjectsListRecursively(Headers, ArrayOfObjects, Detailed, Filter);
+    
+    If Detailed Then
+        BreakDownObjectsInDetail(Token, ArrayOfObjects);    
+    EndIf;
+    
+    Return ArrayOfObjects;
+    
+EndFunction
+
+// Get list of files
+// Gets the list of files
+// 
+// Parameters:
+//  Token       - String - Token                          - token
+//  NameContains - String - Filter by name                 - querry
+//  Directory     - String - Filter by parent directory ID  - catalog
+// 
+// Return value:
+//  Key-Value Pair - Array of file mappings
+Function GetFilesList(Val Token, Val NameContains = "", Val Directory = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(NameContains);
+    OPI_TypeConversion.GetLine(Directory);
+    
+    Headers      = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    ArrayOfObjects = New Array;
+    Filter          = New Array;
+    
+    Filter.Add("mimeType != 'application/vnd.google-apps.folder'");
+    
+    If ValueFilled(NameContains) Then
+        Filter.Add("name contains '" + NameContains + "'");
+    EndIf;
+    
+    If ValueFilled(Directory) Then
+        Filter.Add("'" + Directory + "' in parents");
+    EndIf;
+    
+    GetObjectsListRecursively(Headers, ArrayOfObjects, , Filter);
+    
+    Return ArrayOfObjects;
+
+EndFunction
+
+// Upload file
+// Uploads a file to the drive
+// 
+// Parameters:
+//  Token     - String                        - Token                     - token
+//  File      - BinaryData,String         - File to be uploaded          - file
+//  Description  - Key-Value Pair - See GetFileDescription - props - JSON description or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function UploadFile(Val Token, Val File, Val Description) Export
+    Return FileManagement(Token, File, Description);   
+EndFunction
+
+// Create folder
+// Creates an empty directory on the drive
+// 
+// Parameters:
+//  Token    - String - Token      - token
+//  Name      - String - Folder name  - title
+//  Parent - String - Parent   - catalog
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function CreateFolder(Val Token, Val Name, Val Parent = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Name);
+    OPI_TypeConversion.GetLine(Parent);
+    
+    Description = New Match;
+    Description.Insert("MIME"    , "application/vnd.google-apps.folder");
+    Description.Insert("Name"     , Name);
+    Description.Insert("Description", "");
+    Description.Insert("Parent", ?(ValueFilled(Parent), Parent, "root"));
+    
+    Return FileManagement(Token, , Description);
+    
+EndFunction
+
+// Download file
+// Gets file by ID
+// 
+// Parameters:
+//  Token          - String - Token                 - token
+//  Identifier  - String - File identifier   - object
+//  SavePath - String - File save path - out 
+// 
+// Return value:
+//  BinaryData,String - Binary data or file path when SavePath parameter is specified
+Function DownloadFile(Val Token, Val Identifier, Val SavePath = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Identifier);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Identifier;  
+    
+    Parameters = New Match;
+    Parameters.Insert("alt", "media");
+    
+    Response = OPI_Tools.Get(URL, Parameters , Headers, SavePath);
+    
+    Return Response;
+
+EndFunction
+
+// Copy object
+// Copies file or directory
+// 
+// Parameters:
+//  Token         - String - Token                     - token
+//  Identifier - String - Object identifier     - object
+//  NewName      - String - New object name         - title
+//  NewParent - String - New parent directory  - catalog
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function CopyObject(Val Token, Val Identifier, Val NewName = "", Val NewParent = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(NewName);
+    OPI_TypeConversion.GetLine(Identifier);
+    OPI_TypeConversion.GetLine(NewParent);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Identifier + "/copy";    
+    
+    Parameters = New Structure;
+    
+    If ValueFilled(NewName) Then
+        Parameters.Insert("name", NewName);
+    EndIf;
+    
+    If ValueFilled(NewParent) Then
+        
+        ArrayOfParents = New Array;
+        ArrayOfParents.Add(NewParent);
+        Parameters.Insert("parents", ArrayOfParents);
+        
+    EndIf;
+    
+    Response = OPI_Tools.Post(URL, Parameters , Headers, True);
+    
+    Return Response;
+
+EndFunction
+
+// Update file
+// Updates file binary data
+// 
+// Parameters:
+//  Token         - String - Token                                     - token
+//  Identifier - String - Identifier of the object to update        - object
+//  File          - BinaryData,String - File source for update   - file
+//  NewName      - String - Nоinое имя file (еwithли необхоdимо)         - title
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function UpdateFile(Val Token, Val Identifier, Val File, Val NewName = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Identifier);
+    OPI_TypeConversion.GetLine(NewName);
+    OPI_TypeConversion.GetBinaryData(File);
+    
+    If ValueFilled(NewName) Then
+        Description = New Match;
+        Description.Insert("Name", NewName);
+    Else
+        Description = "";
+    EndIf;
+    
+    Return FileManagement(Token, File, Description, Identifier);
+        
+EndFunction
+
+// Delete object
+// Deletes file or directory by ID
+// 
+// Parameters:
+//  Token         - String - Token                               - token
+//  Identifier - String - Identifier of the object to delete  - object
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function DeleteObject(Val Token, Val Identifier) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Identifier);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Identifier;    
+    Response     = OPI_Tools.Delete(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get file description !NOCLI
+// 
+// Return value:
+//  Key-Value Pair - File description
+Function GetFileDescription() Export
+    
+    Description = New Match;
+    Description.Insert("MIME"        , "image/jpeg");       // MIME-type uploading file
+    Description.Insert("Name"         , "New file.jpg");   // File name with extension
+    Description.Insert("Description"    , "This is a new file");   // File description
+    Description.Insert("Parent"    , "root");             // ID directory upload or "root" for upload in root
+    
+    Return Description;
+    
+EndFunction
+
+#EndRegion
+
+#Region CommentManagement
+
+// Create comment
+// Creates a comment for a file or directory
+// 
+// Parameters:
+//  Token         - String - Token                                                     - token
+//  Identifier - String - Identifier of the object that needs a comment - object  
+//  Comment   - String - Comment text                                         - text
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function CreateComment(Val Token, Val Identifier, Val Comment) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Identifier);
+    OPI_TypeConversion.GetLine(Comment);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Identifier + "/comments?fields=*"; 
+    
+    Parameters = New Structure;
+    Parameters.Insert("content", Comment);
+    
+    Response = OPI_Tools.POST(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get comment
+// Gets comment by ID
+// 
+// Parameters:
+//  Token         - String - Token                                                   - token
+//  ObjectID     - String - Identifier of the file or directory where the comment is located - object
+//  CommentID - String - Comment identifier                               - comment
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetComment(Val Token, Val ObjectID, Val CommentID) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ObjectID);
+    OPI_TypeConversion.GetLine(CommentID);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + ObjectID + "/comments/" + CommentID; 
+    
+    Parameters = New Structure;
+    Parameters.Insert("fields", "*");
+    
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get list of comments
+// Gets the list of all comments of the object
+// 
+// Parameters:
+//  Token     - String - Token                  - token
+//  ObjectID - String - Object identifier  - object
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetCommentList(Val Token, Val ObjectID) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ObjectID);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + ObjectID + "/comments"; 
+    
+    Parameters = New Structure;
+    Parameters.Insert("fields", "*");
+    
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Delete comment
+// Deletes comment by ID
+// 
+// Parameters:
+//  Token         - String - Token                                                    - token
+//  ObjectID     - String - Identifier of the file or directory where the comment is located  - object
+//  CommentID - String - Comment identifier                                - comment
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function DeleteComment(Val Token, Val ObjectID, Val CommentID) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ObjectID);
+    OPI_TypeConversion.GetLine(CommentID);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + ObjectID + "/comments/" + CommentID; 
+    
+    Response = OPI_Tools.Delete(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Procedure GetObjectsListRecursively(Val Headers, ArrayOfObjects, Detailed = False, Filter = "", Page = "") 
+    
+    URL       = "https://www.googleapis.com/drive/v3/files";
+    Files     = "files";
+    NPT       = "nextPageToken";
+    Parameters = New Structure;
+    Parameters.Insert("fields", "*");
+    
+    If ValueFilled(Page) Then
+        Parameters.Insert("pageToken", Page);
+    EndIf;
+    
+    If ValueFilled(Filter) And TypeValue(Filter) = Type("Array") Then     
+        FilterString = StrJoin(Filter, " and ");
+        Parameters.Insert("q", FilterString);       
+    EndIf;
+    
+    Result = OPI_Tools.Get(URL, Parameters, Headers);
+        
+    Objects  = Result[Files];
+    Page = Result[NPT];
+        
+    For Each CurrentObject In Objects Do
+         ArrayOfObjects.Add(CurrentObject);
+    EndDo;    
+    
+    If Objects.Quantity() > 0 And ValueFilled(Page) Then
+        GetObjectsListRecursively(Headers, ArrayOfObjects, Detailed, Filter, Page); 
+    EndIf;
+          
+EndProcedure
+
+Procedure BreakDownObjectsInDetail(Val Token, ArrayOfObjects) 
+       
+    For Each CurrentObject In ArrayOfObjects Do
+        
+        ArrayOfFiles = New Array;
+        CurrentID    = CurrentObject["id"];
+        
+        Result    = GetFilesList(Token, , CurrentID);
+        
+        For Each File In Result Do
+            ArrayOfFiles.Add(File);    
+        EndDo;
+        
+        CurrentObject.Insert("files", ArrayOfFiles);
+         
+    EndDo;
+       
+EndProcedure
+
+Procedure FormFileUploadParameters(Description)
+    
+    FormedDescription = New Match;
+    OPI_Tools.RemoveEmptyCollectionFields(Description);
+
+    FieldMapping = New Match;
+    FieldMapping.Insert("MIME"      , "mimeType");
+    FieldMapping.Insert("Name"       , "name");
+    FieldMapping.Insert("Description"  , "description");
+    FieldMapping.Insert("Parent"  , "parents");
+    FieldMapping.Insert("Extension", "fileExtension");
+    
+    For Each Element In Description Do
+        
+        If Element.Key = "Parent" Then
+            
+            CurrentValue = New Array;
+            CurrentValue.Add(Element.Value);
+            
+        Else
+            
+            CurrentValue = Element.Value;
+            
+        EndIf;
+        
+        FieldName = FieldMapping.Get(Element.Key);
+        FormedDescription.Insert(FieldName, CurrentValue);
+        
+    EndDo;
+    
+    Description = FormedDescription;
+    
+EndProcedure
+
+Function FileManagement(Val Token, Val File = "", Val Description = "", Val Identifier = "") 
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Identifier);
+    
+    If ValueFilled(Description) Then
+        OPI_TypeConversion.GetCollection(Description);
+    EndIf;
+    
+    MimeType = "mimeType";
+    
+    If ValueFilled(Identifier) Then
+        MIME = GetObjectInformation(Token, Identifier)[MimeType];
+    Else
+        MIME = Description["MIME"];
+    EndIf;    
+    
+    If Not ValueFilled(Description) Then
+        Description = New Match;
+    EndIf;
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    FormFileUploadParameters(Description);
+    JSONDescription  = OPI_Tools.JSONString(Description);
+    
+    FileMapping = New Match;
+    
+    If ValueFilled(File) Then
+        
+        ChunkSize = 268435457;      
+        Size      = OPI_Tools.ConvertDataWithSizeRetrieval(File, ChunkSize);
+   
+        FileMapping.Insert(File, MIME);
+        
+        If Size < ChunkSize And TypeValue(File) = Type("BinaryData") Then
+            Response = UploadSmallFile(JSONDescription, FileMapping, Headers, Identifier);
+        Else
+            Response = UploadLargeFile(Description, FileMapping, Headers, Identifier);
+        EndIf;
+        
+    Else
+       Response = UploadSmallFile(JSONDescription, FileMapping, Headers, Identifier); 
+    EndIf;
+         
+    Return Response;
+    
+EndFunction
+
+Function UploadSmallFile(Val Description, Val FileMapping, Val Headers, Val Identifier = "")
+    
+    URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
+    
+    If ValueFilled(Identifier) Then
+        URL   = StringReplace(URL, "/files", "/files/" + Identifier);
+        Response = OPI_Tools.PatchMultipartRelated(URL, Description, FileMapping, Headers);
+    Else
+        Response = OPI_Tools.PostMultipartRelated(URL, Description, FileMapping, Headers);
+    EndIf;
+
+    Return Response;
+    
+EndFunction
+
+Function UploadLargeFile(Val Description, Val FileMapping, Val Headers, Val Identifier = "")
+    
+    For Each File In FileMapping Do
+        Binary = File.Key;
+        Break;
+    EndDo;
+    
+    URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
+    
+    If ValueFilled(Identifier) Then
+        URL   = StringReplace(URL, "/files", "/files/" + Identifier);
+        Response = OPI_Tools.Patch(URL, Description, Headers, True, True);
+    Else
+        Response = OPI_Tools.Post(URL, Description, Headers, True, True);
+    EndIf;
+         
+    UploadURL = Response.Headers["Location"];
+    
+    If Not ValueFilled(UploadURL) Then
+        OPI_Tools.ProcessResponse(Response);
+        Return Response;
+    EndIf;
+       
+	UploadResponse = UploadFileInParts(Binary, UploadURL);
+	Response         = ?(ValueFilled(UploadResponse), UploadResponse, Response);
+    
+    OPI_Tools.ProcessResponse(Response);
+    Return Response;
+   
+EndFunction
+
+Function UploadFileInParts(Val Binary, Val UploadURL)
+	
+	Response            = "";
+	ChunkSize      = 268435456;
+	BytesRead    = 0;
+    CurrentPosition   = 0;
+    TotalSize      = Binary.Size();
+    StrTotalSize   = OPI_Tools.NumberToString(TotalSize);
+    ReadingData     = New ReadingData(Binary);
+    SourceStream    = ReadingData.SourceStream();
+    
+    WHile BytesRead < TotalSize Do
+            
+        BytesRead    = SourceStream.CurrentPosition();
+        Result        = ReadingData.Read(ChunkSize);
+        Current data    = Result.GetBinaryData();
+        CurrentSize    = Current data.Size();
+        NextPosition = CurrentPosition + CurrentSize - 1; 
+        
+        If Not ValueFilled(Current data) Then
+            Break;
+        EndIf;
+        
+        StreamHeader = "bytes "
+            + OPI_Tools.NumberToString(CurrentPosition)
+            + "-" 
+            + OPI_Tools.NumberToString(NextPosition) 
+            + "/" 
+            + StrTotalSize;
+            
+        AdditionalHeaders     = New Match;
+        AdditionalHeaders.Insert("Content-Length", OPI_Tools.NumberToString(CurrentSize));
+        AdditionalHeaders.Insert("Content-Range" , StreamHeader); 
+        AdditionalHeaders.Insert("Content-Type"  , "application/octet-stream");
+        
+        Response = OPI_Tools.Put(UploadURL, Current data, AdditionalHeaders, False, True);
+        
+		CheckResult = CheckPartUpload(Response, StrTotalSize, AdditionalHeaders, UploadURL, CurrentPosition);
+		
+		If ValueFilled(CheckResult) Then
+			Return CheckResult;
+		EndIf;
+        
+        // !OInt KBytes = 1024;
+        // !OInt MByte = KBytes * KBytes;
+		// !OInt Notify(OPI_Tools.ProgressInformation(CurrentPosition, TotalSize, "MB", MByte));
+        
+        // !OInt PerformGarbageCollection();
+        // !OInt ReleaseObject(Current data);
+        
+    EndDo;
+    
+    Return Response;
+    
+EndFunction
+
+Function CheckPartUpload(Response, StrTotalSize, AdditionalHeaders, UploadURL, CurrentPosition)
+	
+    StartOfErrorCodes = 400;
+    EndOfFailureCodes = 600;
+    StartOfSuccessCodes = 200;
+    EndOfSuccessCodes  = 300;
+    Redirection   = 308;
+    
+    If Response.StatusCode >= StartOfErrorCodes And Response.StatusCode < EndOfFailureCodes Then
+         
+        StreamHeader = "bytes */" + StrTotalSize;
+        AdditionalHeaders.Insert("Content-Range" , StreamHeader);
+        
+        CheckResponse = OPI_Tools.Put(UploadURL, "", AdditionalHeaders, False, True);
+        
+        If CheckResponse.StatusCode >= StartOfSuccessCodes And CheckResponse.StatusCode < EndOfSuccessCodes Then
+        	
+            OPI_Tools.ProcessResponse(CheckResponse);
+            Return CheckResponse;
+            
+        ElsIf CheckResponse.StatusCode = Redirection Then
+        	
+            UploadedData = Response.Headers["Range"];
+            
+        Else
+        	
+            OPI_Tools.ProcessResponse(Response);
+        	Return Response;
+        	
+        EndIf;
+        
+    Else
+        UploadedData = Response.Headers["Range"];
+    EndIf;
+        
+    If Not ValueFilled(UploadedData) Then
+        OPI_Tools.ProcessResponse(Response);
+        Return Response;
+    EndIf;
+    
+    UploadedData = StringReplace(UploadedData, "bytes=", "");
+    ArrayOfInformation  = StrSplit(UploadedData, "-", False);
+    PartsRequired  = 2;
+    
+    If Not ArrayOfInformation.Quantity() = PartsRequired Then
+    	OPI_Tools.ProcessResponse(Response);
+        Return Response;
+    EndIf;
+    
+    CurrentPosition = Number(ArrayOfInformation[1]) + 1;
+    
+    Return "";
+        
+EndFunction
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo b/service/interim/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
new file mode 100644
index 0000000000..1cc27c5aac
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
new file mode 100644
index 0000000000..fe61a908f8
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
@@ -0,0 +1,409 @@
+// Location OS: ./OInt/core/Modules/OPI_GoogleSheets.os
+// Library: Google Sheets
+// CLI Command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region BookWork
+
+// CreateBook
+// Creates a new book
+// 
+// Parameters:
+//  Token            - String           - Token                                           - token
+//  Name     - String           - Name                                    - title
+//  ArrayOfSheetNames - Array of Strings - Array of names to add new sheets to the book - sheets
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function CreateBook(Val Token, Val Name, Val ArrayOfSheetNames) Export
+    
+    OPI_TypeConversion.GetLine(Name);
+    OPI_TypeConversion.GetCollection(ArrayOfSheetNames);
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets";
+   
+    Properties  = New Structure("title" , Name);
+    Sheets     = New Array;
+    
+    FillSheetArray(ArrayOfSheetNames, Sheets);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("properties", Properties, "Collection", Parameters);
+    OPI_Tools.AddField("sheets"    , Sheets   , "Collection", Parameters);
+    
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// GetBook
+// Gets information about the book by ID
+// 
+// Parameters:
+//  Token         - String - Token               - token
+//  Identifier - String - BookIdentifier - spreadsheet
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetBook(Val Token, Val Identifier) Export
+
+    OPI_TypeConversion.GetLine(Identifier); 
+    
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Identifier;
+    
+    Response = OPI_Tools.Get(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// ChangeBookName
+// Changes the name of the existing book
+// 
+// Parameters:
+//  Token        - String - Token              - token
+//  Book        - String - BookID           - spreadsheet
+//  Name - String - New name - title
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function EditBookTitle(Val Token, Val Book, Val Name) Export
+    
+    OPI_TypeConversion.GetLine(Book);
+    OPI_TypeConversion.GetLine(Name);
+    
+    Headers    = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate";
+    
+    Change       = New Structure("title", Name);
+    ChangeRequest = New Structure("properties,fields", Change, "title");
+    Request          = New Structure("updateSpreadsheetProperties", ChangeRequest);
+    
+    ArrayOfRequests  = New Array;
+    ArrayOfRequests.Add(Request);
+    
+    Parameters = New Structure("requests", ArrayOfRequests);
+        
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region SheetWork
+
+// AddSheet
+// Adds a new sheet to the book
+// 
+// 
+// Parameters:
+//  Token        - String - Token                     - token
+//  Book        - String - BookIdentifier       - spreadsheet
+//  Name - String - NewSheetName - title
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function AddSheet(Val Token, Val Book, Val Name) Export
+    
+    OPI_TypeConversion.GetLine(Book);
+        
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate";
+    Sheet      = CreateSheet(Name);
+    
+    Requests   = New Array;
+    Change = New Structure("addSheet", Sheet);
+    Requests.Add(Change);
+    
+    Parameters = New Structure("requests", Requests);
+    
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// DeleteSheet
+// Deletes a sheet from the book
+// 
+// Parameters:
+//  Token   - String - Token                          - token
+//  Book   - String - BookIdentifier            - spreadsheet
+//  Sheet    - String - IdentifierOfSheetToDelete - sheet
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function DeleteSheet(Val Token, Val Book, Val Sheet) Export
+    
+    OPI_TypeConversion.GetLine(Book);
+    OPI_TypeConversion.GetLine(Sheet);
+        
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate";
+    
+    Requests   = New Array;
+    Sheet      = New Structure("sheetId"    , Sheet);
+    Change = New Structure("deleteSheet", Sheet);
+    Requests.Add(Change);
+    
+    Parameters = New Structure("requests", Requests);
+    
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// CopySheet
+// Copies a sheet from one book to another
+// 
+// Parameters:
+//  Token  - String - Token - token
+//  From - String - SourceBookID   - from
+//  To   - String - DestinationBookID   - to
+//  Sheet   - String - CopiedSheetID - sheet
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function CopySheet(Val Token, Val From, Val To, Val Sheet) Export
+    
+    OPI_TypeConversion.GetLine(From);
+    OPI_TypeConversion.GetLine(To);
+    OPI_TypeConversion.GetLine(Sheet);
+        
+    Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets/"
+        + From
+        + "/sheets/"
+        + Sheet
+        + ":copyTo";
+    
+    Parameters = New Structure("destinationSpreadsheetId", To);  
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+   
+EndFunction
+
+#EndRegion
+
+#Region DataWork
+
+// SetCellValues
+// Sets sheet cell values
+// 
+// Parameters:
+//  Token                - String                        - Token    - token
+//  Book                - String                        - BookID - spreadsheet 
+//  ValueMapping - Key-Value Pair - Fill data where the key is the cell name like A1   - data
+//  Sheet                 - String                        - Name лиwithта (перinый лиwithт по умолчанию) - sheetname
+//  MajorDimension    - String                        - Main dimension when filling the array range - dim
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function SetCellValues(Val Token
+    , Val Book
+    , Val ValueMapping
+    , Val Sheet = ""
+    , Val MajorDimension = "COLUMNS") Export
+    
+    OPI_TypeConversion.GetLine(Book);
+    OPI_TypeConversion.GetCollection(ValueMapping);
+    
+    If Not TypeValue(ValueMapping) = Type("Structure")
+        And Not TypeValue(ValueMapping) = Type("Match") Then
+        Return "Failed to convert the structure of values to a collection";
+    EndIf;
+    
+    Headers    = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchUpdate";
+    Data array = FormCellDataArray(ValueMapping, MajorDimension, Sheet);
+
+    Parameters = New Structure("data,valueInputOption", Data array, "USER_ENTERED");
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Clear cells
+// Clears the value in cells
+// 
+// Parameters:
+//  Token       - String           - Token                                - token
+//  Book       - String           - BookID                             - spreadsheet
+//  Cell array - Array of Strings - Array of cells like A1 to be cleared     - cells
+//  Sheet        - String           - Name лиwithта (перinый лиwithт по умолчанию) - sheetname
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function ClearCells(Val Token, Val Book, Val Cell array, Val Sheet = "") Export
+    
+    OPI_TypeConversion.GetLine(Book);
+    OPI_TypeConversion.GetCollection(Cell array);
+    
+    Headers    = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchClear";
+    
+    FormCellNameArray(Cell array, Sheet);
+        
+    Parameters = New Structure("ranges", Cell array);
+    Response     = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get cell values
+// Gets cell values of the table
+// 
+// Parameters:
+//  Token       - String           - Token                                                              - token
+//  Book       - String           - BookID                                                           - spreadsheet
+//  Cell array - Array of Strings - Array ячееto inиdа А1 for получения (inеwithь лиwithт, еwithли не заполнено)  - cells
+//  Sheet        - String           - Name лиwithта (перinый лиwithт по умолчанию)                               - sheetname
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetCellValues(Val Token, Val Book, Val Cell array = "", Val Sheet = "") Export
+    
+    OPI_TypeConversion.GetLine(Book);
+      
+    Headers    = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
+    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchGet";
+  
+    If ValueFilled(Cell array) Then
+        OPI_TypeConversion.GetCollection(Cell array);  
+        FormCellNameArray(Cell array, Sheet);
+        
+        First = True;
+        For Each Cell In Cell array Do
+            Delimiter = ?(First, "?", "&");
+            URL         = URL + Delimiter + "ranges=" + Cell;
+            First      = False;
+        EndDo;
+    Else
+        URL = URL + "?ranges='" + Sheet + "'";
+    EndIf;
+    
+    Response = OPI_Tools.Get(URL, , Headers);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Procedure FillSheetArray(Val ArrayOfNames, SheetArray)
+    
+    For Each SheetName In ArrayOfNames Do
+        
+        Sheet = CreateSheet(SheetName);
+        SheetArray.Add(Sheet);
+        
+    EndDo;
+
+EndProcedure
+
+Procedure AddSheetName(Cell, Val Sheet)
+    
+    If ValueFilled(Sheet) Then
+		Cell     = "'" + Sheet + "'!" + Cell;
+    EndIf;
+    
+EndProcedure
+
+Function CreateSheet(Val Name)
+    
+    OPI_TypeConversion.GetLine(Name);
+    
+    Sheet properties = New Structure("title"     , Name);
+    Sheet          = New Structure("properties", Sheet properties);
+
+    Return Sheet;
+    
+EndFunction
+
+Function FormCellDataArray(Val ValueStructure, Val MajorDimension, Val Sheet)
+    
+    OPI_TypeConversion.GetLine(Sheet);
+    
+    Data array = New Array;
+    
+    For Each CellData In ValueStructure Do
+        
+        CurrentValue = CellData.Value;
+        Current key     = CellData.Key;
+        
+        AddSheetName(Current key, Sheet);
+        
+        OPI_TypeConversion.GetArray(CurrentValue);
+        
+        Current data   = New Match;
+        Current array   = New Array;
+        
+        Current array.Add(CurrentValue);
+        
+        OPI_Tools.AddField("range"         , Current key      , "String", Current data);
+        OPI_Tools.AddField("values"        , Current array    , "Array", Current data);
+        OPI_Tools.AddField("majorDimension", MajorDimension, "String", Current data);
+        
+        Data array.Add(Current data);
+        
+    EndDo;
+    
+    Return Data array;
+    
+EndFunction
+
+Procedure FormCellNameArray(Val ArrayOfNames, Val Sheet)
+
+   OPI_TypeConversion.GetLine(Sheet); 
+   
+   For N = 0 For ArrayOfNames.WithinBoundary() Do       
+       AddSheetName(ArrayOfNames[N], Sheet);
+   EndDo;
+       
+EndProcedure
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo b/service/interim/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
new file mode 100644
index 0000000000..cf32e69a19
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
rename to service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo b/service/interim/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
new file mode 100644
index 0000000000..7f7001eaea
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/CommonModules/OPI_Notion/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Notion/Module.bsl
new file mode 100644
index 0000000000..2e77d4863b
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Notion/Module.bsl
@@ -0,0 +1,889 @@
+// Location OS: ./OInt/core/Modules/OPI_Notion.os
+// Library: Notion
+// CLI command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region PageManagement
+
+// Create page
+// Creates a child page above another parent page
+// 
+// Parameters:
+//  Token     - String - Token                  - token
+//  Parent  - String - Parent ID            - page
+//  Title - String - Page title     - title
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function CreatePage(Val Token, Val Parent, Val Title) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Parent);
+    OPI_TypeConversion.GetLine(Title);
+    
+    Headers = CreateRequestHeaders(Token);   
+    Properties  = New Structure;
+    Parameters = New Structure;
+    
+    AddPageHeader(Title, Properties);
+    AddPageParent(Parent, False, Parameters);
+    
+    Parameters.Insert("properties", Properties);
+    
+    Response = OPI_Tools.Post("https://api.notion.com/v1/pages", Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Create page in database
+// Creates a page in the parent database
+// 
+// Parameters:
+//  Token    - String                        - Token                - token 
+//  Parent - String                        - Parent database ID - base
+//  Data   - Key-Value Pair - Properties match - data
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function CreatePageInDatabase(Val Token, Val Parent, Val Data) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Parent);
+    OPI_TypeConversion.GetCollection(Data);
+    
+    Headers  = CreateRequestHeaders(Token);
+    Parameters  = New Structure;
+    
+    AddPageParent(Parent, True, Parameters);
+
+    Properties = FillDataBySchema(Parent, Data, Token);    
+    Parameters.Insert("properties", Properties);
+    
+    Response = OPI_Tools.Post("https://api.notion.com/v1/pages", Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get page
+// Gets information about the page by ID
+// 
+// Parameters:
+//  Token    - String - Token        - token
+//  Page - String - Page ID  - page 
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function GetPage(Val Token, Val Page) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Page);
+    
+    Headers = CreateRequestHeaders(Token);
+    ConvertID(Page);  
+    
+    Response = OPI_Tools.Get("https://api.notion.com/v1/pages/" + Page, , Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Edit page properties.
+// 
+// Parameters:
+//  Token        - String                        - Token                                   - token
+//  Page     - String                        - ID of the page being modified                  - page
+//  Data       - Key-Value Pair - Matching of editable parameters      - data
+//  Icon       - String                        - URL of the page icon image            - icon
+//  Cover      - String                        - URL of the page cover image           - cover
+//  Archived - Boolean                        - Archive page or нет (boolean)  - archive
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function EditPageProperties(Val Token
+    , Val Page
+    , Val Data = ""
+    , Val Icon = ""
+    , Val Cover = ""
+    , Val Archived = False) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Page);
+    OPI_TypeConversion.GetLine(Icon);
+    OPI_TypeConversion.GetLine(Cover);
+    OPI_TypeConversion.GetBoolean(Archived);
+    OPI_TypeConversion.GetCollection(Data);
+    
+    Headers  = CreateRequestHeaders(Token);
+    Parameters  = New Structure;
+    Files      = "files";
+    
+    If ValueFilled(Data) 
+        And (TypeValue(Data) = Type("Match") Or TypeValue(Data) = Type("Structure")) Then
+        Properties = FillDataBySchema(Page, Data, Token, False); 
+    Else 
+        Properties = New Match;
+    EndIf;
+        
+    If ValueFilled(Icon) Then
+        Icon match = New Match;
+        Icon match.Insert("Icon", Icon);
+        
+        Icon object = ConvertValueByType(Files, Icon match);
+        Icon object = Icon object[Files][0];
+        Icon object.Delete("name");
+        
+        Parameters.Insert("icon", Icon object);
+    EndIf;
+    
+    If ValueFilled(Cover) Then
+        Cover match = New Match;
+        Cover match.Insert("Cover", Cover);
+
+        Cover object = ConvertValueByType(Files, Cover match);
+        Cover object = Cover object[Files][0];
+        Cover object.Delete("name");
+
+        Parameters.Insert("cover", Cover object);
+    EndIf;
+
+    Parameters.Insert("properties", Properties);
+    Parameters.Insert("archived"  , Archived);
+    
+    ConvertID(Page);
+
+    Response = OPI_Tools.Patch("https://api.notion.com/v1/pages/" + Page, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region DatabaseManagement
+
+// Create database
+// Creates a database
+// 
+// Parameters:
+//  Token     - String              - Token                    - token 
+//  Parent  - String              - Parent page ID     - page
+//  Title - String              - Database title    - title
+//  Properties  - Structure Of String - Database properties     - props
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function CreateDatabase(Val Token, Val Parent, Val Title, Val Properties = "") Export
+
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Parent);
+    OPI_TypeConversion.GetLine(Title);
+    OPI_TypeConversion.GetCollection(Properties);
+    
+    // Example structure/property map
+    
+    // Name        : title
+    // Description : rich_text
+    // In progress : checkbox 
+    // Quantity    : number
+    // Date        : date
+    // Status      : Map
+    //               Active      : green
+    //               Inactive    : red
+    //               Archive     : yellow
+    
+    // All pages created as children must have parent base properties
+
+    If Not TypeValue(Properties) = Type("Structure") And Not TypeValue(Properties) = Type("Match") Then
+        Properties = New Structure("Name", "title");
+    EndIf;
+
+    Headers = CreateRequestHeaders(Token);     
+    Parameters = New Structure;
+    
+    AddDatabaseParent(Parent, False, Parameters);
+    AddDatabaseHeader(Title, Parameters);
+    AddDatabaseProperties(Properties, Parameters);
+
+    Response = OPI_Tools.Post("https://api.notion.com/v1/databases", Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get database
+// Get database information
+// 
+// Parameters:
+//  Token - String - Token          - token
+//  Base  - String - Database ID - base
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function GetDatabase(Val Token, Val Base) Export
+   
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Base);
+    
+    Headers = CreateRequestHeaders(Token);
+    ConvertID(Base);  
+    
+    Response = OPI_Tools.Get("https://api.notion.com/v1/databases/" + Base, , Headers);
+    
+    Return Response; 
+    
+EndFunction
+
+// Edit database properties
+// Edits properties of an existing database
+// 
+// Parameters:
+//  Token     - String                        - Token                                     - token
+//  Base      - String                        - Target database ID                           - base
+//  Properties  - Map from KeyAndValue - New or modified database properties - props
+//  Title - String                        - New database title                      - title
+//  Description  - String                        - New database description                       - description
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function EditDatabaseProperties(Val Token, Val Base, Val Properties = "", Val Title = "", Val Description = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Base);
+    OPI_TypeConversion.GetLine(Title);
+    OPI_TypeConversion.GetLine(Description);
+    OPI_TypeConversion.GetCollection(Properties);
+    
+    Parameters = New Structure;
+    Headers = CreateRequestHeaders(Token);  
+    ConvertID(Base); 
+    
+    If ValueFilled(Title) Then
+        AddDatabaseHeader(Title, Parameters);
+    EndIf;
+    
+    If ValueFilled(Description) Then
+        AddDatabaseDescription(Description, Parameters);
+    EndIf;
+    
+    If TypeValue(Properties) = Type("Structure") Or TypeValue(Properties) = Type("Match") Then
+        AddDatabaseProperties(Properties, Parameters);
+    EndIf;
+    
+    Response = OPI_Tools.Patch("https://api.notion.com/v1/databases/" + Base, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion 
+
+#Region BlockWork
+
+// Create block
+// Creates a new block based on an existing block
+// 
+// Parameters:
+//  Token         - String                               - Token                                              - token
+//  Parent      - String                               - Parent block or page ID                - page
+//  Block          - String, Map From KeyAndValue - Block ID or block sample itself                      - block
+//  InsertAfter - String                               - Block ID after which to insert the new one - prev
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function CreateBlock(Val Token, Val Parent, Val Block, Val InsertAfter = "") Export
+  
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Parent);
+    OPI_TypeConversion.GetLine(InsertAfter);
+    OPI_TypeConversion.GetCollection(Block);
+    
+    If TypeValue(Block) = Type("Array") Then
+        Block = Block[0];
+    EndIf;
+    
+    Headers    = CreateRequestHeaders(Token); 
+    ConvertID(Parent);
+    
+    If TypeValue(Block) = Type("String") Then
+        ConvertID(Block);
+        Block = ReturnBlock(Token, Block);
+    EndIf;
+    
+    BlockArray = New Array;
+    BlockArray.Add(Block);
+    
+    Parameters = New Match;
+    Parameters.Insert("children", BlockArray);
+    
+    If ValueFilled(InsertAfter) Then
+        Parameters.Insert("after", InsertAfter);
+    EndIf;
+    
+    URL   = "https://api.notion.com/v1/blocks/" + Parent + "/children";
+    Response = OPI_Tools.Patch(URL, Parameters, Headers);
+    
+    Return Response;
+       
+EndFunction
+
+// Inернуть блоto.
+// 
+// Parameters:
+//  Token        - String - Token                                                         - token
+//  BlockID      - String - Block ID                                                      - block
+//  OnlyBase - Boolean - True > service fields are deleted, only the block itself remains   - core
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function ReturnBlock(Val Token, Val BlockID, Val OnlyBase = True) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(BlockID);
+    OPI_TypeConversion.GetBoolean(OnlyBase);
+    
+    ConvertID(BlockID);
+    
+    Headers = CreateRequestHeaders(Token);
+    Response     = OPI_Tools.Get("https://api.notion.com/v1/blocks/" + BlockID, , Headers);
+    
+    If OnlyBase Then
+        RemoveExtraBlockFields(Response);    
+    EndIf;
+    
+    Return Response;
+        
+EndFunction
+
+// Return child blocks
+// Returns list of child blocks of parent block
+// 
+// Parameters:
+//  Token   - String - Token             - token
+//  BlockID - String - Parent block ID - block
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function ReturnChildBlocks(Val Token, Val BlockID) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(BlockID);
+    
+    ConvertID(BlockID);
+    
+    Headers = CreateRequestHeaders(Token);
+    Response     = OPI_Tools.Get("https://api.notion.com/v1/blocks/" + BlockID + "/children", , Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Delete block
+// Deletes block by ID
+// 
+// Parameters:
+//  Token   - String - Token    - token
+//  BlockID - String - Block ID - block
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function DeleteBlock(Val Token, Val BlockID) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(BlockID);
+    
+    ConvertID(BlockID);
+    
+    Headers = CreateRequestHeaders(Token);
+    Response     = OPI_Tools.Delete("https://api.notion.com/v1/blocks/" + BlockID, , Headers);
+    
+    Return Response;
+        
+EndFunction
+    
+#EndRegion
+
+#Region Users
+
+// User list
+// Returns a list of workspace users
+// 
+// Parameters:
+//  Token - String - Token - token
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function UserList(Val Token) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    
+    Headers = CreateRequestHeaders(Token);
+    Response     = OPI_Tools.Get("https://api.notion.com/v1/users", , Headers);
+    
+    Return Response;
+        
+EndFunction
+
+// Get user data
+// Gets user data by ID
+// 
+// Parameters:
+//  Token          - String - Token                     - token
+//  UserID - String - Target user ID  - user
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Notion
+Function GetUserData(Val Token, Val UserID) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(UserID);
+    
+    ConvertID(UserID);
+    
+    Headers = CreateRequestHeaders(Token);
+    Response     = OPI_Tools.Get("https://api.notion.com/v1/users/" + UserID, , Headers);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function CreateRequestHeaders(Val Token)
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    Headers = New Match;
+    Headers.Insert("Authorization" , "Bearer " + Token);
+    Headers.Insert("Notion-Version", "2022-06-28");
+    
+    Return Headers;
+        
+EndFunction
+
+Procedure ConvertID(Identifier)
+    
+    OPI_TypeConversion.GetLine(Identifier);
+    
+    Identifier = StringReplace(Identifier, "-", "");
+    
+EndProcedure
+
+Procedure AddPageParent(Val Parent, Val ParentBase, MainStructure)
+  
+    OPI_TypeConversion.GetLine(ParentBase);
+    
+    ConvertID(Parent);
+  
+    IdentifierField = ?(ParentBase, "database_id", "page_id");
+    ParentStructure  = New Structure(IdentifierField, Parent);
+
+    MainStructure.Insert("parent", ParentStructure);
+     
+EndProcedure
+
+Procedure AddDatabaseParent(Val Parent, Val ParentBase, MainStructure)
+  
+    OPI_TypeConversion.GetLine(ParentBase);
+    
+    ConvertID(Parent);
+  
+    IdentifierField = ?(ParentBase, "database_id", "page_id");
+    
+    ParentStructure  = New Structure();
+    ParentStructure.Insert("type"            , IdentifierField);
+    ParentStructure.Insert(IdentifierField, Parent);
+
+    MainStructure.Insert("parent", ParentStructure);
+     
+EndProcedure
+
+Procedure AddPageHeader(Val Title, MainStructure) 
+    
+    OPI_TypeConversion.GetLine(Title);
+    
+    SubordinateStructure = New Structure;
+    DataStructure      = New Structure;
+    TextStructure      = New Structure;
+    Data array         = New Array;
+    Title                = "title";
+    
+    TextStructure.Insert("content", Title);
+    TextStructure.Insert("link"   , Undefined);
+   
+    DataStructure.Insert("text", TextStructure);
+    DataStructure.Insert("type", "text");
+    
+    Data array.Add(DataStructure);
+    
+    SubordinateStructure.Insert("id"   , Title);
+    SubordinateStructure.Insert("type" , Title);
+    SubordinateStructure.Insert(Title  , Data array);
+    
+    MainStructure.Insert(Title, SubordinateStructure);
+    
+EndProcedure
+
+Procedure AddDatabaseHeader(Val Title, MainStructure)
+    
+    OPI_TypeConversion.GetLine(Title);
+    
+    Title = ConvertHeader(Title);    
+    MainStructure.Insert("title", Title["title"]);
+    
+EndProcedure
+
+Procedure AddDatabaseDescription(Val Description, MainStructure)
+    
+    OPI_TypeConversion.GetLine(Description);
+    
+    Title = ConvertHeader(Description);    
+    MainStructure.Insert("description", Title["title"]);
+    
+EndProcedure
+
+Procedure AddDatabaseProperties(Val Properties, MainStructure)
+    
+    If Properties.Quantity() = 0 Then
+       MainStructure.Insert("properties", New Structure);
+       Return;      
+    EndIf;
+    
+    ParameterMap = New Match;
+    
+    For Each Property In Properties Do
+        
+        If TypeValue(Property.Value) = Type("String") Then
+            
+           ParameterMap.Insert(Property.Key, New Structure(Property.Value, New Structure));
+           
+        ElsIf TypeValue(Property.Value) = Type("Structure") 
+            Or TypeValue(Property.Value) = Type("Match") Then
+                
+            ValueSelection = FormSelectionValues(Property.Value);
+            ParameterMap.Insert(Property.Key, New Structure("select", ValueSelection));
+            
+        Else
+            
+            ParameterMap.Insert(Property.Key, Property.Value);
+            
+        EndIf;
+        
+    EndDo;
+    
+    MainStructure.Insert("properties", ParameterMap);
+    
+EndProcedure
+
+Function FormSelectionValues(Val VariantStructure)
+    
+    OptionArray = New Array;
+    
+    For Each Option In VariantStructure Do
+        
+        OptionMap = New Match;
+        OptionMap.Insert("name" , Option.Key);
+        OptionMap.Insert("color", Option.Value);
+        
+        OptionArray.Add(OptionMap);
+                
+    EndDo;
+    
+    Return New Structure("options", OptionArray);
+        
+EndFunction
+
+Function FillDataBySchema(Val Scheme, Val Data, Val Token, Val ThisIsBase = True)
+    
+    If ThisIsBase Then
+        SchemaData = GetDatabase(Token, Scheme);
+    Else
+        SchemaData = GetPage(Token, Scheme);    
+    EndIf;
+    
+    BaseFields   = SchemaData["properties"];
+    Properties   = New Match;
+    
+    If ValueFilled(BaseFields) Then
+        
+        For Each Field In BaseFields Do
+            
+            FieldData = Field.Value;
+            FieldType    = FieldData["type"];
+            
+            FillableData = Data.Get(Field.Key);
+            
+            If FillableData = Undefined Then
+                Continue;
+            EndIf;
+            
+            ConvertedData = ConvertValueByType(FieldType, FillableData);
+            
+            If ConvertedData = Undefined Then
+                Continue;
+            EndIf;
+            
+            Properties.Insert(FieldData["id"], ConvertedData); 
+            
+        EndDo;
+        
+    EndIf;
+
+    Return Properties;
+
+EndFunction
+
+Procedure RemoveExtraBlockFields(Val Block)
+    
+    ExtraArray = New Array;
+    ExtraArray.Add("request_id");
+    ExtraArray.Add("archived");
+    ExtraArray.Add("created_by");
+    ExtraArray.Add("last_edited_time");
+    ExtraArray.Add("created_time");
+    ExtraArray.Add("has_children");
+    ExtraArray.Add("parrent");
+    ExtraArray.Add("last_edited_by");
+    ExtraArray.Add("id");
+    
+    For Each Field In ExtraArray Do
+        
+        If Not Block.Get(Field) = Undefined Then
+            Block.Delete(Field);
+        EndIf;
+        
+    EndDo;
+    
+EndProcedure
+
+#Region TypeConversion
+
+Function ConvertValueByType(Val Type, Val Value)
+    
+    If Type = "title" Then
+        Return ConvertHeader(Value);
+    ElsIf Type = "rich_text" Then
+        Return ConvertText(Value);
+    ElsIf Type = "number" Then
+        Return ConvertNumber(Value);
+    ElsIf Type = "select" Then
+        Return ConvertSelectionOption(Value);
+    ElsIf Type = "multi_select" Then
+        Return ConvertMultipleChoice(Value);
+    ElsIf Type = "status" Then
+        Return ConvertStatus(Value);
+    ElsIf Type = "date" Then
+        Return ConvertDate(Value);
+    ElsIf Type = "relation" Then
+        Return ConvertLink(Value);
+    ElsIf Type = "people" Then
+        Return ConvertUsers(Value);
+    ElsIf Type = "files" Then
+        Return ConvertFiles(Value);
+    ElsIf Type = "checkbox" Then
+        Return ConvertBoolean(Value);
+    ElsIf Type = "url" Then
+        Return ConvertLink(Value);
+    ElsIf Type = "email" Then
+        Return ConvertEmail(Value);
+    ElsIf Type = "phone_number" Then
+        Return ConvertPhone(Value);
+    Else 
+        Return Undefined;
+    EndIf;
+    
+EndFunction
+
+Function ConvertHeader(Val Title) 
+    
+    DataStructure      = New Structure;
+    TextStructure      = New Structure;
+    Data array         = New Array;
+    
+    TextStructure.Insert("content", Title);
+    TextStructure.Insert("link"   , Undefined);
+    
+    DataStructure.Insert("type", "text");
+    DataStructure.Insert("text", TextStructure);
+       
+    Data array.Add(DataStructure);
+
+    Return New Structure("title", Data array);
+    
+EndFunction
+
+Function ConvertText(Val Text)
+    
+    TextArray    = New Array;
+    TextStructure = New Structure;
+    
+    TextStructure.Insert("type", "text");
+    TextStructure.Insert("text", New Structure("content", Text));
+    
+    TextArray.Add(TextStructure);
+    
+    Return New Structure("rich_text", TextArray);
+    
+EndFunction
+
+Function ConvertNumber(Val Number)
+    Return New Structure("number", Number);
+EndFunction
+
+Function ConvertSelectionOption(Val Option)
+    
+    ChoiceStructure = New Structure;
+    ChoiceStructure.Insert("select", New Structure("name", Option));
+    
+    Return ChoiceStructure;
+    
+EndFunction
+
+Function ConvertStatus(Val Status)
+    
+    StatusStructure = New Structure;
+    StatusStructure.Insert("status", New Structure("name", Status));
+    
+    Return StatusStructure;
+    
+EndFunction
+
+Function ConvertMultipleChoice(Val OptionArray)
+    
+    ChoiceOptionArray = New Array;
+    
+    For Each Option In OptionArray Do
+        ChoiceOptionArray.Add(New Structure("name", Option));
+    EndDo;
+    
+    Return New Structure("multi_select", ChoiceOptionArray);
+    
+EndFunction
+
+Function ConvertDate(Val Date)
+    
+    DateStructure = New Structure;
+    
+    If Date = StartOfDay(Date) Then
+        DateFormat = "DF=yyyy-MM-dd";
+    Else
+        DateFormat = "ISO8601Datetime";
+    EndIf;
+    
+    Date = Format(Date, DateFormat);
+    DateStructure.Insert("start", Date);
+    
+    Return New Structure("date", DateStructure);
+    
+EndFunction
+
+Function ConvertLink(Val Identifier) 
+    
+    LinkArray = New Array;
+    LinkArray.Add(New Structure("id", Identifier));
+    
+    Return New Structure("relation", LinkArray);
+    
+EndFunction
+
+Function ConvertUsers(Val IDArray)
+    
+    If Not TypeValue(IDArray) = Type("Array") Then
+        ArrayID_ = New Array;
+        ArrayID_.Add(IDArray);
+        IDArray = ArrayID_;
+    EndIf;
+    
+    ArrayOfUsers = New Array;
+    
+    For Each Identifier In IDArray Do
+        
+        UserStructure = New Structure;
+        UserStructure.Insert("object", "user");
+        UserStructure.Insert("id"    , Identifier);
+        ArrayOfUsers.Add(UserStructure);
+        
+    EndDo;
+    
+    Return New Structure("people", ArrayOfUsers);
+    
+EndFunction
+
+Function ConvertFiles(Val FileMapping)
+        
+    ArrayOfFiles = New Array;
+    
+    For Each File In FileMapping Do
+        
+        FileStructure = New Structure;
+        FileStructure.Insert("type"    , "external");
+        FileStructure.Insert("name"    , File.Key);
+        FileStructure.Insert("external", New Structure("url", File.Value));
+        
+        ArrayOfFiles.Add(FileStructure);
+        
+    EndDo;
+
+    Return New Structure("files", ArrayOfFiles);
+    
+EndFunction
+
+Function ConvertBoolean(Val Boolean)
+    Return New Structure("checkbox", Boolean);
+EndFunction
+
+Function ConvertLink(Val URL)
+    Return New Structure("url", URL);
+EndFunction
+
+Function ConvertEmail(Val Email)
+    Return New Structure("email", Email);
+EndFunction
+
+Function ConvertPhone(Val Phone)
+    Return New Structure("phone_number", Phone);
+EndFunction
+
+#EndRegion
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
new file mode 100644
index 0000000000..159dbf1812
--- /dev/null
+++ b/service/interim/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>Methodы work with Notion (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Slack/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Slack/Module.bsl
new file mode 100644
index 0000000000..52f0a4464e
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Slack/Module.bsl
@@ -0,0 +1,1055 @@
+// Location OS: ./OInt/core/Modules/OPI_Slack.os
+// Library: Slack
+// CLI command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region ManagementAndSettings
+
+// Get bot information
+// Gets basic information about the bot
+// 
+// Parameters:
+//  Token - String - Bot token - token
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack 
+Function GetBotInformation(Val Token) Export
+    
+    URL       = "https://slack.com/api/auth.test";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Response = OPI_Tools.Get(URL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get workspace list
+// Gets a list of workspaces where the bot is connected
+// 
+// Parameters:
+//  Token  - String - Bot token                                                    - token
+//  Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetWorkspaceList(Val Token, Val Cursor = "") Export
+    
+    URL   = "https://slack.com/api/auth.teams.list";
+    Response = GeneralDataRetrieval(Token, URL, Cursor);
+    
+    Return Response;
+
+EndFunction
+
+// Get user list
+// Gets a list of users in the workspace
+// 
+// Parameters:
+//  Token  - String - Bot token                                                    - token
+//  Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetUserList(Val Token, Val Cursor = "") Export
+    
+    URL   = "https://slack.com/api/users.list";
+    Response = GeneralDataRetrieval(Token, URL, Cursor);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region MessageManagement
+
+// Send message
+// Sends a message at a selected hour
+// 
+// Parameters:
+//  Token        - String - Bot token                              - token
+//  Channel        - String - Channel ID                    - channel
+//  Text        - String - Message text                         - text
+//  Sending date - Date   - Sending date for delayed message - date 
+//  Blocks        - Array of Structures - Array of block descriptions     - blocks - JSON array of block descriptions
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function SendMessage(Val Token, Val Channel, Val Text = "", Val Sending date = "", Val Blocks = "") Export
+      
+    String_   = "String";
+    HasDate  = ValueFilled(Sending date); 
+    Headers = GetAuthorizationHeader(Token);
+    
+    If ValueFilled(Blocks) And TypeValue(Blocks) = Type(String_) Then
+        OPI_TypeConversion.GetCollection(Blocks);
+        
+        If TypeValue(Blocks) = Type("Array") Then
+            
+            For N = 0 For Blocks.WithinBoundary() Do
+                OPI_TypeConversion.GetCollection(Blocks[N]);                    
+            EndDo;
+            
+        EndIf;
+
+    EndIf;
+        
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel, String_    , Parameters);
+    OPI_Tools.AddField("text"   , Text, String_    , Parameters);
+    OPI_Tools.AddField("blocks" , Blocks, "Array"   , Parameters);
+
+    If HasDate Then
+        
+        URL      = "https://slack.com/api/chat.scheduleMessage";
+        OPI_Tools.AddField("post_at", Sending date, "Date", Parameters); 
+        
+    Else
+        
+        URL = "https://slack.com/api/chat.postMessage";
+        
+    EndIf;
+          
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Send ephemeral message
+// Sends a message that arrives in the channel but is visible 
+// only to a specific user
+// 
+// Parameters:
+//  Token        - String - Bot token                              - token
+//  Channel        - String - Channel ID                    - channel
+//  Text        - String - Message text                         - text
+//  User - String - User ID                         - user 
+//  Blocks        - Array of Structures - Array of block descriptions     - blocks - JSON array of block descriptions
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function SendEphemeralMessage(Val Token
+    , Val Channel
+    , Val Text = ""
+    , Val User = ""
+    , Val Blocks = "") Export
+    
+    String_ = "String";
+    
+    If ValueFilled(Blocks) And Not TypeValue(Blocks) = Type(String_) Then
+        OPI_TypeConversion.GetArray(Blocks);
+    EndIf;
+    
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel       , String_    , Parameters);
+    OPI_Tools.AddField("text"   , Text       , String_    , Parameters);
+    OPI_Tools.AddField("user"   , User, String_    , Parameters);
+    OPI_Tools.AddField("blocks" , Blocks       , "Collection", Parameters);
+        
+    URL = "https://slack.com/api/chat.postEphemeral";
+        
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Edit message
+// Edits the content of an existing message
+// 
+// Parameters:
+//  Token        - String - Bot token                          - token
+//  Channel        - String - Channel ID                - channel
+//  Timestamp      - String - Message timestamp         - stamp
+//  Text        - String - New message text               - text
+//  BlockArray - Array of Structures - Array of block descriptions - blocks - JSON array of block descriptions
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function EditMessage(Val Token, Val Channel, Val Timestamp, Val Text = "", Val BlockArray = "") Export
+    
+    String_   = "String";
+    URL       = "https://slack.com/api/chat.update";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel       , String_    , Parameters);
+    OPI_Tools.AddField("text"   , Text       , String_    , Parameters);
+    OPI_Tools.AddField("ts"     , Timestamp     , String_    , Parameters);
+    OPI_Tools.AddField("blocks" , BlockArray, "Collection", Parameters);
+        
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Delete message
+// Deletes a channel message by timestamp
+// 
+// Parameters:
+//  Token         - String - Bot token                             - token
+//  Channel         - String - Channel ID                   - channel
+//  Timestamp       - String - Timestamp or message ID     - stamp
+//  IsDelayed - Boolean - Indicator of deleting a delayed message - issheduled
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function DeleteMessage(Val Token, Val Channel, Val Timestamp, Val IsDelayed = False) Export
+    
+    OPI_TypeConversion.GetBoolean(IsDelayed);
+    
+    Headers = GetAuthorizationHeader(Token);
+        
+    If IsDelayed Then
+        URL         = "https://slack.com/api/chat.deleteScheduledMessage";
+        TimestampField = "scheduled_message_id";       
+    Else
+        URL         = "https://slack.com/api/chat.delete";
+        TimestampField = "ts";
+    EndIf;
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel"  , Channel  , "String", Parameters);
+    OPI_Tools.AddField(TimestampField, Timestamp, "String", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get list of delayed messages
+// Gets a list of delayed channel messages
+// 
+// Parameters:
+//  Token  - String - Bot token                                                    - token
+//  Channel  - String - Channel ID                                          - channel
+//  Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetDelayedMessageList(Val Token, Val Channel, Val Cursor = "") Export
+    
+    URL       = "https://slack.com/api/chat.scheduledMessages.list";
+    Headers = GetAuthorizationHeader(Token);
+   
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel , "String", Parameters);
+    OPI_Tools.AddField("cursor" , Cursor, "String", Parameters);
+    
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get message link
+// Gets a permanent URL to the channel message
+// 
+// Parameters:
+//  Token         - String - Bot token                             - token
+//  Channel         - String - Channel ID                   - channel
+//  Timestamp       - String - Timestamp or message ID     - stamp
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetMessageLink(Val Token, Val Channel, Val Timestamp) Export
+    
+    URL       = "https://slack.com/api/chat.getPermalink";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel"   , Channel  , "String", Parameters);
+    OPI_Tools.AddField("message_ts", Timestamp, "String", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get list of message replies
+// Gets an array of messages that are replies to the specified
+// 
+// Parameters:
+//  Token         - String - Bot token                                                    - token
+//  Channel         - String - Channel ID                                          - channel
+//  Timestamp       - String - Timestamp or message ID                            - stamp
+//  Cursor        - String - Pointer from the previous request, if the result rows > 100 - cursor
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetMessageReplyList(Val Token, Val Channel, Val Timestamp, Val Cursor = "") Export
+    
+    String_   = "String";
+    URL       = "https://slack.com/api/conversations.replies";
+    Headers = GetAuthorizationHeader(Token);
+   
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel  , String_, Parameters);
+    OPI_Tools.AddField("cursor" , Cursor , String_, Parameters);
+    OPI_Tools.AddField("ts"     , Timestamp, String_, Parameters);
+    
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region ChannelManagement
+
+// Get channel list
+// Gets a list of available channels
+// 
+// Parameters:
+//  Token                   - String - Bot token                                                    - token
+//  ExcludeArchived - Boolean - Indicator of excluding archived channels                     - notarchived 
+//  Cursor                  - String - Pointer from the previous request, if the result rows > 100 - cursor
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetChannelList(Val Token, Val ExcludeArchived = False, Val Cursor = "") Export
+    
+    URL       = "https://slack.com/api/conversations.list";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("exclude_archived", ExcludeArchived, "Boolean", Parameters);
+    OPI_Tools.AddField("cursor"          , Cursor                 , "String", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get channel user list
+// Gets a list of users in the specified channel
+// 
+// Parameters:
+//  Token         - String - Bot token                                                    - token
+//  Channel         - String - Channel ID                                          - channel
+//  Cursor        - String - Pointer from the previous request, if the result rows > 100 - cursor
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetChannelUserList(Val Token, Val Channel, Val Cursor = "") Export
+    
+    URL       = "https://slack.com/api/conversations.members";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel , "String", Parameters);
+    OPI_Tools.AddField("cursor" , Cursor, "String", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Create channel
+// Creates a new channel
+// 
+// Parameters:
+//  Token     - String - Bot token              - token
+//  Name  - String - Channel name     - title
+//  Private - Boolean - Create channel as private - private
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function CreateChannel(Val Token, Val Name, Val Private = False) Export
+    
+    URL       = "https://slack.com/api/conversations.create";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("name"      , Name , "String", Parameters);
+    OPI_Tools.AddField("is_private", Private, "Boolean", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+     
+EndFunction
+
+// Archive channel
+// Archives an active channel
+// 
+// Parameters:
+//  Token - String - Bot token - token
+//  Channel - String - Channel ID  - channel
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function ArchiveChannel(Val Token, Val Channel) Export
+    
+    URL   = "https://slack.com/api/conversations.archive";
+    Response = DialogManagement(Token, Channel, URL);
+    Return Response;
+    
+EndFunction
+
+// Get channel
+// Gets information about the channel
+// 
+// Parameters:
+//  Token - String - Bot token - token
+//  Channel - String - Channel ID  - channel
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetChannel(Val Token, Val Channel) Export
+    
+    URL   = "https://slack.com/api/conversations.info";
+    Response = DialogManagement(Token, Channel, URL, "GET");
+    Return Response;
+
+EndFunction
+
+// Get channel history
+// Gets information about channel events
+// 
+// Parameters:
+//  Token - String - Bot token - token
+//  Channel - String - Channel ID  - channel
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetChannelHistory(Val Token, Val Channel) Export
+    
+    URL   = "https://slack.com/api/conversations.history";
+    Response = DialogManagement(Token, Channel, URL, "GET");
+    Return Response;
+
+EndFunction
+
+// Invite users to channel
+// Adds specified users to the channel
+// 
+// Parameters:
+//  Token               - String           - Bot token              - token
+//  Channel               - String           - Channel ID               - channel
+//  ArrayOfUsers - Array Of String - User ID Array - users
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function InviteUsersToChannel(Val Token, Val Channel, Val ArrayOfUsers) Export
+    
+    URL       = "https://slack.com/api/conversations.invite";
+    Headers = GetAuthorizationHeader(Token);
+    
+    OPI_TypeConversion.GetCollection(ArrayOfUsers);
+    ArrayOfUsers = StrJoin(ArrayOfUsers, ",");
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel              , "String", Parameters);
+    OPI_Tools.AddField("users"  , ArrayOfUsers, "String", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Kick user from channel
+// Removes specified user from channel
+// 
+// Parameters:
+//  Token        - String - Bot token      - token
+//  Channel        - String - Channel ID       - channel
+//  User - String - User ID - user
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function KickUserFromChannel(Val Token, Val Channel, Val User) Export
+    
+    URL       = "https://slack.com/api/conversations.kick";
+    Headers = GetAuthorizationHeader(Token);
+        
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel       , "String", Parameters);
+    OPI_Tools.AddField("user"   , User, "String", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Join channel
+// Adds the current bot to the channel
+// 
+// Parameters:
+//  Token - String - Bot token - token
+//  Channel - String - Channel ID  - channel
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function JoinChannel(Val Token, Val Channel) Export
+    
+    URL   = "https://slack.com/api/conversations.join";
+    Response = DialogManagement(Token, Channel, URL);
+    Return Response;
+
+EndFunction
+
+// Leave channel
+// Removes the current bot from the channel
+// 
+// Parameters:
+//  Token - String - Bot token - token
+//  Channel - String - Channel ID  - channel
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function LeaveChannel(Val Token, Val Channel) Export
+    
+    URL   = "https://slack.com/api/conversations.leave";
+    Response = DialogManagement(Token, Channel, URL);
+    Return Response;
+
+EndFunction
+
+// Set channel topic
+// Sets the channel topic
+// 
+// Parameters:
+//  Token - String - Bot token  - token
+//  Channel - String - Channel ID   - channel
+//  Topic  - String - Channel topic - theme
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function SetChannelTopic(Val Token, Val Channel, Val Topic) Export
+    
+    URL       = "https://slack.com/api/conversations.setTopic";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel , "String", Parameters);
+    OPI_Tools.AddField("topic"  , Topic  , "String", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Set channel purpose
+// Sets the channel purpose (description)
+// 
+// Parameters:
+//  Token - String - Bot token  - token
+//  Channel - String - Channel ID   - channel
+//  Purpose  - String - Channel purpose - purpose
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function SetChannelGoal(Val Token, Val Channel, Val Purpose) Export
+    
+    URL       = "https://slack.com/api/conversations.setPurpose";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel , "String", Parameters);
+    OPI_Tools.AddField("purpose", Purpose  , "String", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Rename channel
+// Changes the name of the channel
+// 
+// Parameters:
+//  Token     - String - Bot token            - token
+//  Channel     - String - Channel ID             - channel
+//  Name  - String - New channel name - title
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function RenameChannel(Val Token, Val Channel, Val Name) Export
+    
+    URL       = "https://slack.com/api/conversations.rename";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel   , "String", Parameters);
+    OPI_Tools.AddField("name"   , Name, "String", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region DialogManagement
+
+// Open dialog
+// Opens a new dialog with one or more users
+// 
+// Parameters:
+//  Token               - String           - Bot token              - token
+//  ArrayOfUsers - Array of Strings - User ID Array - users
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function OpenDialog(Val Token, Val ArrayOfUsers) Export
+    
+    URL       = "https://slack.com/api/conversations.open";
+    Headers = GetAuthorizationHeader(Token);
+    
+    OPI_TypeConversion.GetCollection(ArrayOfUsers);
+    ArrayOfUsers = StrJoin(ArrayOfUsers, ",");
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("users", ArrayOfUsers, "String", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Close dialog
+// Closes an existing dialog
+// 
+// Parameters:
+//  Token  - String - Bot token - token
+//  Dialog - String - Dialog ID - conv
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function CloseDialog(Val Token, Val Dialog) Export
+    
+    URL   = "https://slack.com/api/conversations.close";
+    Response = DialogManagement(Token, Dialog, URL);
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region FileWork
+
+// Get list of files
+// Gets a list of files of the bot or channel
+// 
+// Parameters:
+//  Token          - String        - Bot token       - token
+//  Channel          - String        - Channel for selection - channel 
+//  PageNumber  - Number, String - Page number   - page
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetFilesList(Val Token, Val Channel = "", Val PageNumber = 1) Export
+    
+    URL       = "https://slack.com/api/files.list";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel        , "String", Parameters);
+    OPI_Tools.AddField("page"   , PageNumber, "String", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Upload file
+// Uploads a file to Slack servers
+// 
+// Parameters:
+//  Token     - String                - Bot token              - token
+//  File      - String, BinaryData - File for upload       - file
+//  FileName  - String                - File name with extension - filename
+//  Title - String                - File name in Slack       - title
+//  Channel     - String                - Channel ID               - channel
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function UploadFile(Val Token, Val File, Val FileName, Val Title, Val Channel = "") Export
+    
+    OPI_TypeConversion.GetBinaryData(File);
+    OPI_TypeConversion.GetLine(FileName);
+    OPI_TypeConversion.GetLine(Title);
+    
+    String_    = "String";
+    Upload_url = "upload_url";
+    File_id    = "file_id";
+    URL        = "https://slack.com/api/files.getUploadURLExternal";
+    Headers  = GetAuthorizationHeader(Token);
+    Size     = File.Size();
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("filename", FileName, String_, Parameters);
+    OPI_Tools.AddField("length"  , Size  , String_, Parameters);
+
+    Response         = OPI_Tools.Get(URL, Parameters, Headers);
+    URL           = Response[Upload_url];
+    Identifier = Response[File_id];
+    
+    If Not ValueFilled(URL) Or Not ValueFilled(Identifier) Then
+        Return Response;
+    EndIf;
+    
+    Files = New Match;
+    Files.Insert(FileName, File);
+    
+    Response     = OPI_Tools.PostMultipart(URL, , Files, , Headers);
+    URL       = "https://slack.com/api/files.completeUploadExternal"; 
+    SlackFile  = New Structure("id, title", Identifier, Title);   
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("filename"  , FileName, String_, Parameters);
+    OPI_Tools.AddField("channel_id", Channel   , String_, Parameters);
+    OPI_Tools.AddField("files"     , SlackFile, "Array", Parameters);
+
+    Response = OPI_Tools.Post(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get file data
+// Gets information about the file
+// 
+// Parameters:
+//  Token              - String - Bot token          - token
+//  FileID - String - File identifier - fileid
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetFileData(Val Token, Val FileID) Export
+    
+    URL   = "https://slack.com/api/files.info";
+    Response = FileManagement(Token, FileID, URL, "GET");
+    
+    Return Response;
+    
+EndFunction
+
+// Delete file
+// Deletes a file on Slack
+// 
+// Parameters:
+//  Token              - String - Bot token          - token
+//  FileID - String - File identifier - fileid
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function DeleteFile(Val Token, Val FileID) Export
+    
+    URL   = "https://slack.com/api/files.delete";
+    Response = FileManagement(Token, FileID, URL);
+    
+    Return Response;
+  
+EndFunction
+
+// Make file public
+// Creates a public URL for the file. Requires user token
+// 
+// Parameters:
+//  Token              - String - User token  - token
+//  FileID - String - File identifier - fileid
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function MakeFilePublic(Val Token, Val FileID) Export
+    
+    URL   = "https://slack.com/api/files.sharedPublicURL";
+    Response = FileManagement(Token, FileID, URL);
+    
+    Return Response;
+  
+EndFunction
+
+// Make file private
+// Removes the public URL from the file. Requires user token
+// 
+// Parameters:
+//  Token              - String - User token  - token
+//  FileID - String - File identifier - fileid
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function MakeFilePrivate(Val Token, Val FileID) Export
+    
+    URL   = "https://slack.com/api/files.revokePublicURL";
+    Response = FileManagement(Token, FileID, URL);
+    
+    Return Response;
+  
+EndFunction
+
+#EndRegion
+
+#Region DeletedFilesManagement
+
+// Get list of external files
+// Gets a list of external files of a user or channel
+// 
+// Parameters:
+//  Token  - String - Bot token                                                    - token
+//  Channel  - String - Channel for selection                                              - channel 
+//  Cursor - String - Pointer from the previous request, if the result rows > 100 - cursor
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetExternalFileList(Val Token, Val Channel = "", Val Cursor = "") Export
+    
+    URL       = "https://slack.com/api/files.remote.list";
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel , "String", Parameters);
+    OPI_Tools.AddField("cursor" , Cursor, "String", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get external file
+// Gets information about the external file
+// 
+// Parameters:
+//  Token              - String - Bot token          - token
+//  FileID - String - File identifier - fileid
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function GetExternalFile(Val Token, Val FileID) Export
+  
+    URL   = "https://slack.com/api/files.remote.info";
+    Response = ExternalFileManagement(Token, FileID, URL);
+    
+    Return Response;
+      
+EndFunction
+
+// Add external file
+// Adds a new external file
+// 
+// Parameters:
+//  Token     - String - Bot token                - token
+//  URL       - String - URL to external file      - url
+//  Title - String - File title for Slack - title
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function AddExternalFile(Val Token, Val URL, Val Title) Export
+    
+    String_   = "String";
+    URL       = "https://slack.com/api/files.remote.add";
+    Headers = GetAuthorizationHeader(Token);
+    UID       = String(New UniqueIdentifier());
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("external_url", URL          , String_, Parameters);
+    OPI_Tools.AddField("external_id" , UID          , String_, Parameters);
+    OPI_Tools.AddField("title"       , Title    , String_, Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Send external file
+// Sends an external file to a list of channels
+// 
+// Parameters:
+//  Token              - String           - Bot token                  - token
+//  FileID - String           - File identifier         - fileid
+//  ChannelArray      - Array Of String - Array of channels for sending - channels
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function SendExternalFile(Val Token, Val FileID, Val ChannelArray) Export
+    
+    URL       = "https://slack.com/api/files.remote.share";
+    Headers = GetAuthorizationHeader(Token);
+    
+    OPI_TypeConversion.GetCollection(ChannelArray);
+    ChannelArray = StrJoin(ChannelArray, ",");
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("file"    , FileID , "String", Parameters);
+    OPI_Tools.AddField("channels", ChannelArray      , "String", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Delete external file
+// Deletes an external file from Slack
+// 
+// Parameters:
+//  Token              - String - Bot token          - token
+//  FileID - String - File identifier - fileid
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Slack
+Function DeleteExternalFile(Val Token, Val FileID) Export
+  
+    URL   = "https://slack.com/api/files.remote.remove";
+    Response = ExternalFileManagement(Token, FileID, URL);
+    
+    Return Response;
+      
+EndFunction
+
+#EndRegion
+
+#Region BlockFormation
+
+// Generate image block
+// Generates a block with an image to add to the message block array
+// 
+// Parameters:
+//  URL                 - String - Image URL                   - picture
+//  AlternateText - String - Alternate text of the image  - alt
+// 
+// Return value:
+//  Key-Value Pair -  Image block
+Function GenerateImageBlock(Val URL, Val AlternateText = "") Export
+    
+    String_ = "String";
+    
+    Block = New Match;
+    OPI_Tools.AddField("type"     , "image"              , String_, Block);
+    OPI_Tools.AddField("image_url", URL                  , String_, Block);
+    OPI_Tools.AddField("alt_text" , AlternateText  , String_, Block);
+    
+    Return Block;
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function GetAuthorizationHeader(Val Token)
+
+    OPI_TypeConversion.GetLine(Token);
+    
+    Headers = New Match;
+    Headers.Insert("Authorization", "Bearer " + Token);
+    Return Headers;
+        
+EndFunction
+
+Function DialogManagement(Val Token, Val Channel, Val URL, Val RequestType = "POST")
+    
+    Headers  = GetAuthorizationHeader(Token);
+    RequestType = inReg(RequestType);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("channel", Channel, "String", Parameters);
+
+    If RequestType = "POST" Then
+        Response = OPI_Tools.Post(URL, Parameters, Headers);
+    Else
+        Response = OPI_Tools.Get(URL, Parameters, Headers);
+    EndIf;
+    
+    Return Response;
+    
+EndFunction
+
+Function FileManagement(Val Token, Val FileID, Val URL, Val RequestType = "POST")
+    
+    Headers = GetAuthorizationHeader(Token);
+    RequestType = inReg(RequestType);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("file", FileID , "String", Parameters);
+
+    If RequestType = "POST" Then
+        Response = OPI_Tools.Post(URL, Parameters, Headers);
+    Else
+        Response = OPI_Tools.Get(URL, Parameters, Headers);
+    EndIf;
+
+    Return Response;
+
+EndFunction
+
+Function GeneralDataRetrieval(Val Token, Val URL, Val Cursor)
+    
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("cursor", Cursor, "String", Parameters);
+    
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+Function ExternalFileManagement(Val Token, Val FileID, Val URL)
+    
+    Headers = GetAuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("file", FileID , "String", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
new file mode 100644
index 0000000000..c81e3953ae
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
new file mode 100644
index 0000000000..bdf1fc4a16
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
@@ -0,0 +1,1253 @@
+// Location OS: ./OInt/core/Modules/OPI_Telegram.os
+// Library: Telegram
+// CLI command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region DataRetrievalAndSettings
+
+// Get bot information
+// Inыполняет запроwith /getMe, inозinращающий базоinую информацию о боте: имя, id, inозможноwithть dобаinлять бота in группы и т.d.
+// 
+// Parameters:
+//  Token - String - Bot token - token
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function GetBotInformation(Val Token) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL   = "api.telegram.org/bot" + Token + "/getMe";
+    Response = OPI_Tools.Get(URL);
+    
+    Return Response;
+
+EndFunction
+
+// Get updates
+// Executes a request /getUpdates, returning information about bot events. Used in polling mode
+//
+// Parameters:
+//  Token    - String       - Bot token                             - token
+//  Timeout  - String, Number - Waiting time for new events           - timeout
+//  Offset - String, Number - Offset in the list of received messages - offset
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function GetUpdates(Val Token, Val Timeout = 0, Val Offset = "") Export
+
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL   = "api.telegram.org/bot" + Token + "/getUpdates";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("timeout", Timeout , "String", Parameters);
+    OPI_Tools.AddField("offset" , Offset, "String", Parameters);
+    
+    Response = OPI_Tools.Get(URL, Parameters);
+    Return Response;
+
+EndFunction
+
+// Set Webhook
+// Set webhook URL for bot event handling in webhook mode 
+//          
+// Parameters:
+//  Token - String - Bot token                                      - token
+//  URL   - String - Address processing запроwithоin от Telegram (with https:) - url
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SetWebhook(Val Token, Val URL) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("url", URL, "String", Parameters);
+
+    URL   = "api.telegram.org/bot" + Token + "/setWebHook";
+    Response = OPI_Tools.Get(URL, Parameters);
+    
+    Return Response;
+
+EndFunction
+
+// Delete webhook
+// Deletes the bot event handler URL for webhook operation
+// 
+// Parameters:
+//  Token - String - Bot token - token
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function DeleteWebhook(Val Token) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL   = "api.telegram.org/bot" + Token + "/deleteWebHook";
+    Response = OPI_Tools.Get(URL);
+    
+    Return Response;
+
+EndFunction
+
+// Download file
+// Download file from Telegram servers
+// 
+// Parameters:
+//  Token   - String - Token                   - token
+//  FileID - String - File ID for downloading - fileid
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function DownloadFile(Val Token, Val FileID) Export
+
+    Result = "result";
+    
+    OPI_TypeConversion.GetLine(Token); 
+    OPI_TypeConversion.GetLine(FileID);    
+            
+    Parameters = New Structure("file_id", FileID);
+
+    URL   = "api.telegram.org/bot" + Token + "/getFile";
+    Response = OPI_Tools.Get(URL, Parameters);
+    
+    Path = Response[Result]["file_path"];
+    
+    If Not ValueFilled(Path) Then
+        Return Response;
+    EndIf;
+    
+    URL   = "api.telegram.org/file/bot" + Token + "/" + Path;
+    Response = OPI_Tools.Get(URL, Parameters);
+    
+    Return Response;   
+    
+EndFunction
+
+// Process Telegram Mini App data
+// Processes TMA data and determines its validity
+// 
+// Parameters:
+//  DataString - String - Query from Telegram.WebApp.initData
+//  Token        - String - Bot token
+// 
+// Return value:
+//  Map from String - Map of data with the result of verification in the passed field
+Function ProcessTMAData(Val DataString, Val Token) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(DataString);
+    
+    DataString    = DecodeString(DataString, StringEncodingMethod.URLencoding);
+    DataStructure = OPI_Tools.RequestParametersToMatch(DataString);
+    Key            = "WebAppData";
+    Hash             = "";
+    BinaryKey    = GetBinaryDataFromString(Key);
+
+    Result = OPI_Cryptography.HMACSHA256(BinaryKey, GetBinaryDataFromString(Token));
+
+    TValue = New ValueTable;
+    TValue.Columns.Add("Key");
+    TValue.Columns.Add("Value");
+
+    For Each Data In DataStructure Do
+
+        NewLine             = TValue.Add();
+        NewLine.Key        = Data.Key;
+        NewLine.Value    = Data.Value;
+
+    EndDo;
+
+    TValue.Sort("Key");
+
+    ReturnMapping = New Match;
+    DCS                  = "";
+
+    For Each DataString In TValue Do
+
+        If DataString.Key <> "hash" Then
+            DCS = DCS + DataString.Key + "=" + DataString.Value + Symbols.PS;
+            ReturnMapping.Insert(DataString.Key, DataString.Value);
+        Else
+            Hash = DataString.Value;
+        EndIf;
+
+    EndDo;
+
+    DCS     = Left(DCS, StrLength(DCS) - 1);
+    Signature = OPI_Cryptography.HMACSHA256(Result, GetBinaryDataFromString(DCS));
+
+    Final = GetHexStringFromBinaryData(Signature);
+
+    If Final = inReg(Hash) Then
+        Response = True;
+    Else
+        Response = False;
+    EndIf;
+
+    ReturnMapping.Insert("passed", Response);
+
+    Return ReturnMapping;
+
+EndFunction
+
+#EndRegion
+
+#Region DataSending
+
+// Send text message
+// Sends a text message to a chat or channel
+// 
+// Parameters:
+//  Token      - String       - Bot token                                        - token
+//  ChatID     - String, Number - Target chat ID or ChatID*TopicID                - chat
+//  Text      - String       - Message text                                   - text
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+//  Markup   - String       - View processing textа (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendTextMessage(Val Token
+	, Val ChatID
+	, Val Text
+	, Val Keyboard = ""
+	, Val Markup = "Markdown") Export
+
+    OPI_TypeConversion.GetLine(Token);    
+    OPI_Tools.ReplaceSpecialCharacters(Text, Markup);
+            
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode"  , Markup  , "String"     , Parameters);
+    OPI_Tools.AddField("text"        , Text     , "String"     , Parameters);
+    OPI_Tools.AddField("reply_markup", Keyboard, "FileString", Parameters);
+    
+    AddChatIdentifier(ChatID, Parameters);
+    
+    URL   = "api.telegram.org/bot" + Token + "/sendMessage";
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Send image
+// Sends an image to a chat or channel
+// 
+// Parameters:
+//  Token      - String                - Bot token                                - token
+//  ChatID     - String, Number          - Target chat ID or ChatID*TopicID        - chat
+//  Text      - String                - Message text                           - text
+//  Image   - BinaryData,String - Image file                             - picture
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+//  Markup   - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendImage(Val Token
+	, Val ChatID
+	, Val Text
+	, Val Image
+	, Val Keyboard = ""
+	, Val Markup = "Markdown") Export
+
+    Return SendFile(Token, ChatID, Text, Image, "photo", Keyboard, Markup);
+
+EndFunction
+
+// Send video
+// Sends a video to a chat or channel
+// 
+// Parameters:
+//  Token      - String                - Bot token                                - token
+//  ChatID     - String, Number          - Target chat ID or ChatID*TopicID        - chat
+//  Text      - String                - Message text                           - text
+//  Video      - BinaryData,String - Video file                                - video
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+//  Markup   - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendVideo(Val Token
+	, Val ChatID
+	, Val Text
+	, Val Video
+	, Val Keyboard = ""
+	, Val Markup = "Markdown") Export
+
+    Return SendFile(Token, ChatID, Text, Video, "video", Keyboard, Markup);
+
+EndFunction
+
+// Send audio
+// Sends an audio file to a chat or channel
+// 
+// Parameters:
+//  Token      - String                - Bot token                                - token
+//  ChatID     - String, Number          - Target chat ID or ChatID*TopicID        - chat
+//  Text      - String                - Message text                           - text
+//  Audio      - BinaryData,String - Audio file                                - audio
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+//  Markup   - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendAudio(Val Token
+	, Val ChatID
+	, Val Text
+	, Val Audio
+	, Val Keyboard = ""
+	, Val Markup = "Markdown") Export
+
+    Return SendFile(Token, ChatID, Text, Audio, "audio", Keyboard, Markup);
+
+EndFunction
+
+// Send document
+// Sends a document to a chat or channel
+// 
+// Parameters:
+//  Token      - String                - Bot token                                - token
+//  ChatID     - String, Number          - Target chat ID or ChatID*TopicID        - chat
+//  Text      - String                - Message text                           - text
+//  Document   - BinaryData,String - Document file                            - doc
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+//  Markup   - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendDocument(Val Token
+	, Val ChatID
+	, Val Text
+	, Val Document
+	, Val Keyboard = ""
+	, Val Markup = "Markdown") Export
+
+    Return SendFile(Token, ChatID, Text, Document, "document", Keyboard, Markup);
+
+EndFunction
+
+// Send GIF
+// Sends a GIF to a chat or channel
+// 
+// Parameters:
+//  Token      - String                - Bot token                                - token
+//  ChatID     - String, Number          - Target chat ID or ChatID*TopicID        - chat
+//  Text      - String                - Message text                           - text
+//  GIF      - BinaryData,String - GIF file                                - gif
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+//  Markup   - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendGif(Val Token
+	, Val ChatID
+	, Val Text
+	, Val GIF
+	, Val Keyboard = ""
+	, Val Markup = "Markdown") Export
+
+    Return SendFile(Token, ChatID, Text, GIF, "animation", Keyboard, Markup);
+
+EndFunction
+
+// Send media group
+// Sends a set of files to a chat or channel. Media types: audio, document, photo, video
+// 
+// Parameters:
+//  Token      - String                - Bot token                                - token
+//  ChatID     - String, Number          - Target chat ID or ChatID*TopicID        - chat
+//  Text      - String                - Message text                           - text
+//  FileMapping - Map from String - File collection  - media - File JSON or path to .json
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+//  Markup   - String - View processing textа (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendMediaGroup(Val Token
+	, Val ChatID
+	, Val Text
+	, Val FileMapping
+	, Val Keyboard = ""
+	, Val Markup = "Markdown") Export
+    
+    // FileMapping
+    // Key - File, Value - Type
+    // Types: audio, document, photo, video
+    // Different types cannot be mixed!
+
+	String_ = "String";
+	
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ChatID);
+    OPI_TypeConversion.GetCollection(FileMapping);
+    
+    OPI_Tools.ReplaceSpecialCharacters(Text, Markup);
+
+    URL             = "api.telegram.org/bot" + Token + "/sendMediaGroup";
+    FileStructure = New Structure;
+    Media           = New Array;
+    Parameters       = New Structure;
+    
+    AddChatIdentifier(ChatID, Parameters);
+    FormMediaArray(FileMapping, Text, FileStructure, Media);
+    
+    OPI_Tools.AddField("parse_mode"  , Markup  , String_      , Parameters);
+    OPI_Tools.AddField("caption"     , Text     , String_      , Parameters);
+    OPI_Tools.AddField("media"       , Media     , String_      , Parameters);
+    OPI_Tools.AddField("reply_markup", Keyboard, "FileString", Parameters);
+
+    Response = OPI_Tools.PostMultipart(URL, Parameters, FileStructure, "mixed");
+
+    Return Response;
+
+EndFunction
+
+// Send location
+// Sends location by geographic latitude and longitude to a chat or channel
+// 
+// Parameters:
+//  Token      - String                - Bot token                                - token
+//  ChatID     - String, Number          - Target chat ID or ChatID*TopicID        - chat
+//  Latitude     - String, Number          - Geographic latitude                     - lat
+//  Longitude    - String, Number          - Geographic longitude                    - long
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendLocation(Val Token, Val ChatID, Val Latitude, Val Longitude, Val Keyboard = "") Export
+
+	String_ = "String";
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ChatID);
+    
+    URL = "api.telegram.org/bot" + Token + "/sendLocation";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode"  , "Markdown" , String_      , Parameters);
+    OPI_Tools.AddField("latitude"    , Latitude     , String_      , Parameters);
+    OPI_Tools.AddField("longitude"   , Longitude    , String_      , Parameters);
+    OPI_Tools.AddField("reply_markup", Keyboard , "FileString", Parameters);
+    
+    AddChatIdentifier(ChatID, Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Send contact
+// Sends a contact with name and phone number
+// 
+// Parameters:
+//  Token      - String                - Bot token                                - token
+//  ChatID     - String, Number          - Target chat ID or ChatID*TopicID        - chat
+//  Name        - String                - Contact name                              - name
+//  Last name    - String                - Contact last name                          - surname
+//  Phone    - String                - Contact phone number                          - phone
+//  Keyboard - String - See GenerateKeyboardFromArray - keyboard - Keyboard JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendContact(Val Token, Val ChatID, Val Name, Val Last name, Val Phone, Val Keyboard = "") Export
+
+	String_ = "String";
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ChatID);
+    
+    URL = "api.telegram.org/bot" + Token + "/sendContact";
+
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode"  , "Markdown", String_      , Parameters);
+    OPI_Tools.AddField("first_name"  , Name       , String_      , Parameters);
+    OPI_Tools.AddField("last_name"   , Last name   , String_      , Parameters);
+    OPI_Tools.AddField("phone_number", Phone   , String_      , Parameters);
+    OPI_Tools.AddField("reply_markup", Keyboard, "FileString", Parameters);
+    
+    AddChatIdentifier(ChatID, Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Send poll
+// Sends a poll with answer options
+// 
+// Parameters:
+//  Token         - String                - Bot token                                 - token
+//  ChatID        - String, Number          - Target chat ID or ChatID*TopicID         - chat
+//  Question        - String                - Poll question                              - question
+//  AnswersArray - Array of Strings      - Array of answer options                    - options
+//  Anonymous     - Boolean                - Poll anonymity                         - anonymous
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function SendPoll(Val Token, Val ChatID, Val Question, Val AnswersArray, Val Anonymous = True) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ChatID);
+    OPI_TypeConversion.GetCollection(AnswersArray);
+
+    OPI_TypeConversion.GetBoolean(Anonymous);
+    
+    URL = "api.telegram.org/bot" + Token + "/sendPoll";
+
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode", "Markdown"   , "String"     , Parameters);
+    OPI_Tools.AddField("question"  , Question       , "String"     , Parameters);
+    OPI_Tools.AddField("options"   , AnswersArray, "FileString", Parameters);
+    
+    Parameters.Insert("is_anonymous", ?(Anonymous, 1, 0));   
+    AddChatIdentifier(ChatID, Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Forward message
+// Forwards a message between chats or within a chat
+// 
+// Parameters:
+//  Token         - String       - Bot token                         - token
+//  OriginalID   - String, Number - Original message ID         - message
+//  FromID      - String, Number - Chat ID of the original message    - from
+//  ToID        - String, Number - Target chat ID or ChatID*TopicID - to
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function ForwardMessage(Val Token, Val OriginalID, Val FromID, Val ToID) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(OriginalID);
+    OPI_TypeConversion.GetLine(FromID);
+    OPI_TypeConversion.GetLine(ToID);
+    
+    URL = "api.telegram.org/bot" + Token + "/forwardMessage";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("from_chat_id", FromID   , "String", Parameters);
+    OPI_Tools.AddField("message_id"  , OriginalID, "String", Parameters);
+
+    AddChatIdentifier(ToID, Parameters);
+    
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Generate keyboard from array of buttons
+// Generates a simple JSON keyboard from an array of buttons for a message or bottom panel
+// 
+// Parameters:
+//  ButtonArray  - Array of Strings - Array of buttons                                        - buttons 
+//  UnderMessage - Boolean           - Keyboard under the message or on the bottom panel       - under
+//  OneByOne  - Boolean           - True > buttons are displayed in a column, False > in a row - column
+// 
+// Return value:
+//  String -  Keyboard JSON
+Function FormKeyboardFromButtonArray(Val ButtonArray
+    , Val UnderMessage = False
+    , Val OneByOne = True) Export
+
+    OPI_TypeConversion.GetBoolean(UnderMessage);
+    OPI_TypeConversion.GetBoolean(OneByOne);
+    OPI_TypeConversion.GetCollection(ButtonArray);
+    
+    If OneByOne Then
+        Strings = CreateTallKeyboard(ButtonArray);
+    Else
+        Strings = CreateLongKeyboard(ButtonArray);
+    EndIf;
+
+    If UnderMessage Then
+        ParameterStructure = New Structure("inline_keyboard,rows", Strings, 1);
+    Else
+        ParameterStructure = New Structure("keyboard,resize_keyboard", Strings, True);
+    EndIf;
+
+    Keyboard = OPI_Tools.JSONString(ParameterStructure);
+
+    Return Keyboard;
+
+EndFunction
+
+#EndRegion
+
+#Region Administration
+
+// Ban
+// Bans a user in the selected chat
+// 
+// Parameters:
+//  Token          - String       - Bot token                         - token
+//  ChatID         - String, Number - Target chat ID or ChatID*TopicID - chat
+//  UserID - String, Number - Target user ID           - user
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function Ban(Val Token, Val ChatID, Val UserID) Export
+
+	String_ = "String";
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL = "api.telegram.org/bot" + Token + "/banChatMember";
+
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode", "Markdown"    , String_, Parameters);
+    OPI_Tools.AddField("chat_id"   , ChatID        , String_, Parameters);
+    OPI_Tools.AddField("user_id"   , UserID, String_, Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Unban
+// Unbans a previously banned user
+// 
+// Parameters:
+//  Token          - String       - Bot token                         - token
+//  ChatID         - String, Number - Target chat ID or ChatID*TopicID - chat
+//  UserID - String, Number - Target user ID           - user
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function Unban(Val Token, Val ChatID, Val UserID) Export
+
+	String_ = "String";
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL = "api.telegram.org/bot" + Token + "/unbanChatMember";
+
+    Parameters = New Structure;   
+    OPI_Tools.AddField("parse_mode"    , "Markdown"    , String_ , Parameters);
+    OPI_Tools.AddField("chat_id"       , ChatID        , String_ , Parameters);
+    OPI_Tools.AddField("user_id"       , UserID, String_ , Parameters);
+    OPI_Tools.AddField("only_if_banned", False          , "Boolean", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Create invitation link
+// Creates a link for joining a closed chat
+// 
+// Parameters:
+//  Token              - String         - Bot token                                               - token
+//  ChatID             - String, Number   - Target chat ID or ChatID*TopicID                       - chat
+//  Title          - String         - Invitation title                                    - title
+//  ExpirationDate      - Date           - Date of end жfromни withwithылtoи (withoutwithрочно, еwithли не уtoазано) - expire
+//  UserLimit - Number          - Limit пользоinателей (беwithtoонечно, еwithли не уtoазано)        - limit
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function CreateInvitationLink(Val Token
+    , Val ChatID
+    , Val Title = ""
+    , Val ExpirationDate = ""
+    , Val UserLimit = 0) Export
+
+	String_ = "String";
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL = "api.telegram.org/bot" + Token + "/createChatInviteLink";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode"    , "Markdown"        , String_ , Parameters);
+    OPI_Tools.AddField("chat_id"       , ChatID            , String_ , Parameters);
+    OPI_Tools.AddField("name"          , Title         , String_ , Parameters);
+    OPI_Tools.AddField("member_limit"  , UserLimit, String_ , Parameters);
+    OPI_Tools.AddField("expire_date"   , ExpirationDate     , "Date"  , Parameters);
+    
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Pin message
+// Pins a message in the chat header
+// 
+// Parameters:
+//  Token       - String       - Token                 - token
+//  ChatID      - String, Number - Target chat ID      - chat
+//  MessageID - String, Number - Target message ID - message
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function PinMessage(Val Token, Val ChatID, Val MessageID) Export
+    
+    String_ = "String";
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL = "api.telegram.org/bot" + Token + "/pinChatMessage";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode"          , "Markdown" , String_ , Parameters);
+    OPI_Tools.AddField("chat_id"             , ChatID     , String_ , Parameters);
+    OPI_Tools.AddField("message_id"          , MessageID, String_ , Parameters);
+    OPI_Tools.AddField("disable_notification", False       , "Boolean", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Unpin message
+// Unpins a message in the chat header
+// 
+// Parameters:
+//  Token       - String       - Bot token            - token
+//  ChatID      - String, Number - Target chat ID      - chat
+//  MessageID - String, Number - Target message ID - message
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function UnpinMessage(Val Token, Val ChatID, Val MessageID) Export
+    
+    String_ = "String";
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL = "api.telegram.org/bot" + Token + "/unpinChatMessage";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode", "Markdown" , String_, Parameters);
+    OPI_Tools.AddField("chat_id"   , ChatID     , String_, Parameters);
+    OPI_Tools.AddField("message_id", MessageID, String_, Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+// Get participant count
+// Gets the total number of chat participants
+// 
+// Parameters:
+//  Token  - String       - Bot token       - token
+//  ChatID - String, Number - Target chat ID - chat
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function GetParticipantCount(Val Token, Val ChatID) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL = "api.telegram.org/bot" + Token + "/getChatMemberCount";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode", "Markdown" , "String", Parameters);
+    OPI_Tools.AddField("chat_id"   , ChatID     , "String", Parameters);
+
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region ForumTopicManagement
+
+// Get avatar icon list
+// Gets the mapping of Emoji IDs for setting as forum theme icons
+// 
+// Parameters:
+//  Token - String - Token - token
+// 
+// Return value:
+//  Key-Value Pair - Key > ID, Value > Emoji
+Function GetAvatarIconList(Val Token) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    Result    = "result";
+    URL       = "api.telegram.org/bot" + Token + "/getForumTopicIconStickers";     
+    Response     = OPI_Tools.Get(URL);    
+    Icons    = Response[Result];
+    
+    If Not ValueFilled(Icons) Then
+    	Return Response;
+    EndIf; 
+    
+    Collection = New Match;
+    
+    For Each Icon In Icons Do
+        Collection.Insert(Icon["custom_emoji_id"], Icon["emoji"]);
+    EndDo;
+       
+    Return Collection;
+
+EndFunction
+
+// Create forum thread
+// Creates a new thread in the group with theme functionality enabled
+// 
+// Parameters:
+//  Token     - String       - Token                            - token
+//  ChatID    - String, Number - Thread creation chat ID            - forum
+//  Title - String       - Thread title                   - title
+//  IconID  - String       - See GetAvatarIconList - icon
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function CreateForumThread(Val Token, Val ChatID, Val Title, Val IconID = "") Export
+    Return ForumTopicManagement(Token, ChatID, Title, IconID);
+EndFunction
+
+// Edit forum thread
+// Creates a new thread in the group with theme functionality enabled
+// 
+// Parameters:
+//  Token     - String       - Token                            - token
+//  ChatID    - String, Number - Thread creation chat ID            - forum
+//  ThreadID    - String, Number - Thread ID                          - topic
+//  Title - String       - New title                  - title
+//  IconID  - String       - See GetAvatarIconList - icon
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function EditForumTopic(Val Token
+    , Val ChatID
+    , Val ThreadID
+    , Val Title = Undefined
+    , Val IconID = Undefined) Export   
+     
+    Return ForumTopicManagement(Token, ChatID, Title, IconID, ThreadID);
+EndFunction
+
+// Close forum thread
+// Closes the thread for new messages
+// 
+// Parameters:
+//  Token  - String       - Token        - token
+//  ChatID - String, Number - Thread chat ID - forum
+//  ThreadID - String, Number - Thread ID      - topic
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function CloseForumThread(Val Token, Val ChatID, Val ThreadID = "") Export
+    Return ManageForumThreadState(Token, ChatID, 2, ThreadID);    
+EndFunction
+
+// Open forum thread
+// Reopens a previously closed forum thread
+// 
+// Parameters:
+//  Token  - String       - Token        - token
+//  ChatID - String, Number - Thread chat ID - forum
+//  ThreadID - String, Number - Thread ID      - topic
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function OpenForumThread(Val Token, Val ChatID, Val ThreadID = "") Export
+    Return ManageForumThreadState(Token, ChatID, 1, ThreadID);    
+EndFunction
+
+// Delete forum thread
+// Deletes a forum thread
+// 
+// Parameters:
+//  Token  - String       - Token        - token
+//  ChatID - String, Number - Thread chat ID - forum
+//  ThreadID - String, Number - Thread ID      - topic
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function DeleteForumTopic(Val Token, Val ChatID, Val ThreadID) Export
+    Return ManageForumThreadState(Token, ChatID, 3, ThreadID);    
+EndFunction
+
+// Hide main forum thread
+// Hides the main forum thread
+// 
+// Parameters:
+//  Token  - String       - Token        - token
+//  ChatID - String, Number - Thread chat ID - forum
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function HideMainForumTopic(Val Token, Val ChatID) Export
+    Return ManageMainTopicVisibility(Token, ChatID, True);
+EndFunction
+
+// Show main forum thread
+// Shows a previously hidden main forum thread
+// 
+// Parameters:
+//  Token  - String       - Token        - token
+//  ChatID - String, Number - Thread chat ID - forum
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function ShowMainForumTopic(Val Token, Val ChatID) Export
+    Return ManageMainTopicVisibility(Token, ChatID, False);
+EndFunction
+
+// Edit main forum thread name
+// Edits the name of the main forum thread
+// 
+// Parameters:
+//  Token     - String       - Token                   - token
+//  ChatID    - String, Number - Thread chat ID            - forum
+//  Title - String       - New main thread name  - title
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function EditMainForumTopicName(Val Token, Val ChatID, Val Title) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    URL = "api.telegram.org/bot" + Token + "/editGeneralForumTopic";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("chat_id", ChatID   , "String", Parameters);
+    OPI_Tools.AddField("name"   , Title, "String", Parameters);
+    
+    Response = OPI_Tools.Get(URL, Parameters);
+    
+    Return Response;
+
+EndFunction
+
+// Clear thread's pinned messages list
+// Clears the list of pinned messages in the forum thread
+// 
+// Parameters:
+//  Token  - String       - Token                               - token
+//  ChatID - String, Number - Thread chat ID                        - forum
+//  ThreadID - String, Number - Thread ID. Main if not filled - topic
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from Telegram
+Function ClearThreadPinnedMessagesList(Val Token, Val ChatID, Val ThreadID = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ChatID);
+    OPI_TypeConversion.GetLine(ThreadID);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("chat_id"          , ChatID, "String", Parameters);
+    OPI_Tools.AddField("message_thread_id", ThreadID, "String", Parameters);
+    
+    If ValueFilled(ThreadID) Then
+        Method = "/unpinAllForumTopicMessages";
+    Else
+        Method = "/unpinAllGeneralForumTopicMessages";
+    EndIf;
+        
+    URL   = "api.telegram.org/bot" + Token + Method;
+    Response = OPI_Tools.Get(URL, Parameters);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function SendFile(Val Token, Val ChatID, Val Text, Val File, Val View, Val Keyboard, Val Markup)
+
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(ChatID);
+    OPI_TypeConversion.GetLine(View);
+
+    Extension  = "";
+    Method       = "";
+    
+    DetermineSendMethod(View, Method, Extension);
+    ConvertFileData(File, Extension, View);
+    OPI_Tools.ReplaceSpecialCharacters(Text, Markup);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("parse_mode"  , Markup  , "String"     , Parameters);
+    OPI_Tools.AddField("caption"     , Text     , "String"     , Parameters);
+    OPI_Tools.AddField("reply_markup", Keyboard, "FileString", Parameters);
+    
+    AddChatIdentifier(ChatID, Parameters);
+
+    FileStructure = New Structure;
+    FileStructure.Insert(View + Extension, File);
+
+    URL   = "api.telegram.org/bot" + Token + Method;
+    Response = OPI_Tools.PostMultipart(URL, Parameters, FileStructure, "mixed");
+
+    Return Response;
+
+EndFunction
+
+Function ForumTopicManagement(Val Token
+    , Val ChatID
+    , Val Title = Undefined
+    , Val IconID = Undefined
+    , Val ThreadID = "")
+    
+    String_ = "String";
+    OPI_TypeConversion.GetLine(Token);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("name"                , Title, String_, Parameters);
+    OPI_Tools.AddField("chat_id"             , ChatID   , String_, Parameters);
+    OPI_Tools.AddField("icon_custom_emoji_id", IconID , String_, Parameters);
+    OPI_Tools.AddField("message_thread_id"   , ThreadID   , String_, Parameters);
+    
+    If ValueFilled(ThreadID) Then
+        Method  = "/editForumTopic";    
+    Else    
+        Method = "/createForumTopic";    
+    EndIf;
+    
+    OPI_Tools.RemoveEmptyCollectionFields(Parameters);       
+    Response = OPI_Tools.Get("api.telegram.org/bot" + Token + Method, Parameters);
+    
+    Return Response;
+
+EndFunction
+
+Function ManageForumThreadState(Val Token, Val ChatID, Val Status, Val ThreadID = "") 
+        
+    OPI_TypeConversion.GetLine(Token);
+    
+    If ValueFilled(ThreadID) Then
+        Forum = "Forum";
+    Else
+        Forum = "GeneralForum";
+    EndIf;
+    
+    Method     = DetermineForumManagementMethod(Status, Forum);
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("chat_id"          , ChatID, "String", Parameters);
+    OPI_Tools.AddField("message_thread_id", ThreadID, "String", Parameters);
+   
+    URL   = "api.telegram.org/bot" + Token + Method;
+    Response = OPI_Tools.Get(URL, Parameters);
+
+    Return Response;
+    
+EndFunction
+
+Function ManageMainTopicVisibility(Val Token, Val ChatID, Val Hide)
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetBoolean(Hide);
+
+    If Hide Then
+        Method = "/hideGeneralForumTopic";
+    Else
+        Method = "/unhideGeneralForumTopic";
+    EndIf;
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("chat_id", ChatID, "String", Parameters);
+    
+    URL   = "api.telegram.org/bot" + Token + Method;
+    Response = OPI_Tools.Get(URL, Parameters);
+    
+    Return Response;
+
+EndFunction                 
+
+Function DetermineForumManagementMethod(Val Status, Val Forum) 
+    
+    Open = 1;
+    Close = 2;
+    Delete = 3;
+    
+    If Status = Open Then 
+        Method = "/reopen" + Forum + "Topic";
+    ElsIf Status = Close Then
+        Method = "/close" + Forum + "Topic";
+    ElsIf Status = Delete Then
+        Method = "/deleteForumTopic";
+    Else 
+        Raise "Incorrect forum management status";
+    EndIf;
+    
+    Return Method;
+
+EndFunction
+
+Function CreateTallKeyboard(Val ButtonArray)
+    
+    Strings = New Array;
+    
+    For Each Button In ButtonArray Do
+        Buttons = New Array;
+        Button = OPI_Tools.NumberToString(Button);
+        Buttons.Add(New Structure("text,callback_data", Button, Button));
+        Strings.Add(Buttons);
+    EndDo;
+
+    Return Strings;
+    
+EndFunction
+
+Function CreateLongKeyboard(Val ButtonArray)
+    
+    Strings = New Array;
+    Buttons = New Array;
+    
+    For Each Button In ButtonArray Do
+        Button = OPI_Tools.NumberToString(Button);
+        Buttons.Add(New Structure("text,callback_data", Button, Button));
+    EndDo;
+    
+    Strings.Add(Buttons);
+    
+    Return Strings;
+
+EndFunction
+
+Procedure FormMediaArray(Val FileMapping, Val Text, FileStructure, Media)
+    
+    Counter = 0;
+    
+    OPI_TypeConversion.GetCollection(FileMapping);
+    OPI_TypeConversion.GetLine(Text);
+    
+    If TypeValue(FileMapping) <> Type("Match") Then
+        // !OInt Raise("Failed to Retrieve Information from JSON media!");
+        Return;
+    EndIf;
+   
+    For Each CurrentFile In FileMapping Do
+        
+        If Not TypeValue(CurrentFile.Key) = Type("BinaryData") Then
+            
+            Binary = CurrentFile.Key;
+            OPI_TypeConversion.GetBinaryData(Binary);
+            
+            ThisFile = New File(CurrentFile.Key);           
+            MediaName = CurrentFile.Value 
+                + String(Counter) 
+                + ?(CurrentFile.Value = "document", ThisFile.Extension, "");
+                
+            FullMediaName  = StringReplace(MediaName, ".", "___");
+            
+        Else
+            Binary        = CurrentFile.Key;
+            MediaName        = CurrentFile.Value + String(Counter);
+            FullMediaName  = MediaName;
+        EndIf;
+        
+        FileStructure.Insert(FullMediaName, Binary);
+        
+        MediaStructure = New Structure;
+        MediaStructure.Insert("type" , CurrentFile.Value);
+        MediaStructure.Insert("media", "attach://" + MediaName);
+        
+        If Counter = 0 Then
+            MediaStructure.Insert("caption", Text);
+        EndIf;
+        
+        Media.Add(MediaStructure);
+        
+        Counter = Counter + 1;
+        
+    EndDo;
+
+    Media = OPI_Tools.JSONString(Media);
+    
+EndProcedure
+
+Procedure AddChatIdentifier(Val ChatID, Parameters)
+    
+    ChatID     = OPI_Tools.NumberToString(ChatID);
+    ChatArray = StrSplit(ChatID, "*", False);
+    
+    If ChatArray.Quantity() > 1 Then
+        
+        ChatID = ChatArray[0];
+        ThreadID = ChatArray[1];
+        
+        Parameters.Insert("message_thread_id", ThreadID);
+        
+    EndIf;
+    
+    Parameters.Insert("chat_id", ChatID);
+
+EndProcedure
+
+Procedure DetermineSendMethod(Val View, Method, Extension)
+    
+    If View = "photo" Then
+        Method = "/sendPhoto";
+    ElsIf View = "video" Then
+        Method = "/sendVideo";
+    ElsIf View = "audio" Then
+        Method = "/sendAudio";
+    ElsIf View = "document" Then
+        Method = "/sendDocument";
+    ElsIf View = "animation" Then
+        Method = "/sendAnimation";
+        Extension = ".gif";
+    Else
+        Raise "Incorrect sending view";
+    EndIf;
+
+EndProcedure
+
+Procedure ConvertFileData(File, Extension, View)
+    
+    If Not TypeValue(File) = Type("BinaryData") Then
+        
+        CurrentFile = New File(File);
+        Extension  = ?(View = "document", CurrentFile.Extension, Extension);
+        OPI_TypeConversion.GetBinaryData(File);
+        
+    EndIf;
+
+    Extension = StringReplace(Extension, ".", "___");
+    
+EndProcedure
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
new file mode 100644
index 0000000000..51643d7cc5
--- /dev/null
+++ b/service/interim/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>Methodы интеграции with Telegram (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
new file mode 100644
index 0000000000..c60177beed
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
@@ -0,0 +1,682 @@
+// Location OS: ./OInt/core/Modules/OPI_Twitter.os
+// Library: Twitter
+// CLI Command: 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
+// If in не зtoете with чего toчать, то withтоит toйти метоd GetStandardParameters()
+// and read comments
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+
+//@skip-check method-too-many-params
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region DataAndSettings
+
+// Get authorization link
+// Forms a link for authorization via the browser
+// 
+// Parameters:
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  String -  URL for browser transition
+Function GetAuthorizationLink(Parameters = "") Export
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    
+    URLParameters = New Structure;
+        
+    URLParameters.Insert("response_type"        , "code");
+    URLParameters.Insert("client_id"            , Parameters_["client_id"]);
+    URLParameters.Insert("redirect_uri"         , Parameters_["redirect_uri"]);
+    URLParameters.Insert("scope"                , Parameters_["scope"]);
+    URLParameters.Insert("state"                , "state");
+    URLParameters.Insert("code_challenge"       , "challenge");
+    URLParameters.Insert("code_challenge_method", "plain");
+        
+    URLParameters = OPI_Tools.RequestParametersToString(URLParameters);
+    Link = "https://twitter.com/i/oauth2/authorize" + URLParameters;
+        
+    Return Link;
+    
+EndFunction
+
+// Get token
+// Gets the token by the code obtained during authorization via the link from GetAuthorizationLink
+// 
+// Parameters:
+//  Code        - String              - Code obtained from authorization See GetAuthorizationLink - code
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Twitter
+Function GetToken(Val Code, Val Parameters = "") Export
+
+    OPI_TypeConversion.GetLine(Code);
+        
+    Parameters_ = GetStandardParameters(Parameters);
+
+    RequestParameters = New Structure;
+    RequestParameters.Insert("code"         , Code);
+    RequestParameters.Insert("grant_type"   , "authorization_code");
+    RequestParameters.Insert("client_id"    , Parameters_["client_id"]);
+    RequestParameters.Insert("redirect_uri" , Parameters_["redirect_uri"]);
+    RequestParameters.Insert("code_verifier", "challenge");
+    
+    Response = OPI_Tools.Post("https://api.twitter.com/2/oauth2/token"
+        , RequestParameters, , False);
+        
+    Return Response;
+    
+EndFunction
+
+// Refresh token 
+// Updates the v2 token using the refresh_token
+// 
+// Parameters:
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Twitter
+Function RefreshToken(Val Parameters = "") Export
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Refresh    = "refresh_token";
+    
+    RequestParameters = New Structure;
+    RequestParameters.Insert(Refresh        , Parameters_[Refresh]);
+    RequestParameters.Insert("grant_type"   , Refresh);
+    RequestParameters.Insert("client_id"    , Parameters_["client_id"]);
+    
+    Response = OPI_Tools.Post("https://api.twitter.com/2/oauth2/token"
+    , RequestParameters, , False);
+    
+    Return Response;
+
+EndFunction
+
+// !NOCLI
+// Method for insertion into an http service, the address of which is specified in redirect_uri
+// Calls the token acquisition method, as for obtaining a token from the code received
+// on redirect_uri after authorization via the browser is only 30 seconds
+// 
+// Parameters:
+//  Request - HTTPServiceRequest - Request coming to the http service
+// 
+// Return value:
+//  HTTPResponse, Arbitrary, BinaryData - Result of reading the JSON response from the server
+Function HandleIncomingRequestAfterAuthorization(Request) Export
+    
+    Code         = Request.RequestParameters["code"];    
+    TokenResponse  = GetToken(Code);
+    
+    // BSLLS:CommentedCode-off
+    // Preferred token storage
+    // Constants.TwitterRefresh.Уwithтаноinить(TokenResponse["refresh_token"]);
+    // Constants.TwitterToken.Уwithтаноinить(TokenResponse["access_token"]);
+    // BSLLS:CommentedCode-on
+    
+    Return TokenResponse;
+
+EndFunction
+
+#EndRegion
+
+#Region Tweets
+
+// !NOCLI
+// Create custom tweet
+// 
+// Parameters:
+//  Text - String        -  Tweet text
+//  MediaArray           -  Array from String, BinaryData -  Array of binary data or file paths
+//  PollOptionsArray - Array of Strings -  Array of poll options, if necessary
+//  PollDuration    - String, Number -  Poll duration, еwithли необхоdимо (опроwith without dлительноwithти не withозdаетwithя)
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Twitter
+Function CreateCustomTweet(Val Text = ""
+    , Val MediaArray = ""
+    , Val PollOptionsArray = ""
+    , Val PollDuration = ""
+    , Val Parameters = "") Export 
+    
+    OPI_TypeConversion.GetLine(Text);
+    OPI_TypeConversion.GetLine(PollDuration);
+    
+    If ValueFilled(MediaArray) Then
+        OPI_TypeConversion.GetCollection(MediaArray);
+    EndIf;
+    
+    If ValueFilled(PollOptionsArray) Then
+        OPI_TypeConversion.GetCollection(PollOptionsArray);
+    EndIf;
+    
+    Parameters_         = GetStandardParameters(Parameters);
+    URL                = "https://api.twitter.com/2/tweets";
+    Array             = "Array";    
+    Fields               = New Match;
+    
+    If ValueFilled(Text) Then
+        Fields.Insert("text", Text);
+    EndIf;
+    
+    If TypeValue(PollOptionsArray) = Type(Array) And ValueFilled(PollDuration) Then
+        
+        PollDuration = Number(PollDuration);
+        
+        If PollOptionsArray.Quantity() > 0 Then
+        	
+        	OptionStructure = New Structure("options,duration_minutes", PollOptionsArray, PollDuration);
+            Fields.Insert("poll", OptionStructure);
+            
+        EndIf;
+        
+    EndIf;
+    
+    If TypeValue(MediaArray) = Type(Array) Then
+        If MediaArray.Quantity() > 0 Then
+            Fields.Insert("media", New Structure("media_ids", MediaArray));
+        EndIf;
+    EndIf;
+    
+    Authorization = CreateAuthorizationHeaderV2(Parameters_);
+    Response       = OPI_Tools.Post(URL, Fields, Authorization);
+
+    Return Response;
+    
+EndFunction
+
+// Create text tweet
+// Creates a tweet without attachments
+// 
+// Parameters:
+//  Text      - String              - Tweet text                     - text
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Twitter
+Function CreateTextTweet(Val Text, Val Parameters = "") Export
+    Return CreateCustomTweet(Text, , , , Parameters);    
+EndFunction
+
+// Create image tweet
+// Creates a tweet with an image attachment
+// 
+// Parameters:
+//  Text          - String                          - Tweet text            - text
+//  ImageArray - Array from String, BinaryData - Image files array - pictures
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Twitter
+Function Create image tweet(Val Text, Val ImageArray, Val Parameters = "") Export
+    
+    MediaArray = Upload attachments array(ImageArray, "tweet_image", Parameters);
+    Return CreateCustomTweet(Text, MediaArray, , , Parameters);    
+    
+EndFunction
+
+// Create gif tweet
+// Creates a tweet with a gif attachment
+// 
+// Parameters:
+//  Text       - String                          - Tweet text         - text
+//  Gif array - Array from String, BinaryData - Gif files array - gifs
+//  Parameters   - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Twitter
+Function CreateGifTweet(Val Text, Val Gif array, Val Parameters = "") Export
+    
+    MediaArray = Upload attachments array(Gif array, "tweet_gif", Parameters);
+    Return CreateCustomTweet(Text, MediaArray, , , Parameters);    
+    
+EndFunction
+
+// Create video tweet
+// Creates a tweet with a video attachment
+// 
+// Parameters:
+//  Text       - String                          - Tweet text         - text
+//  Video array - Array from String, BinaryData - Video files array - videos
+//  Parameters   - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Twitter
+Function CreateVideoTweet(Val Text, Val Video array, Val Parameters = "") Export
+    
+    MediaArray = Upload attachments array(Video array, "tweet_video", Parameters);
+    Return CreateCustomTweet(Text, MediaArray, , , Parameters);
+    
+EndFunction
+
+// Create poll tweet
+// Creates a tweet with a poll
+// 
+// Parameters:
+//  Text           - String           - Tweet text               - text
+//  OptionArray - Array of Strings - Poll options array   - options
+//  Duration    - String, Number     - Poll duration       - duration
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Twitter
+Function CreatePollTweet(Val Text, Val OptionArray, Val Duration, Val Parameters = "") Export
+    Return CreateCustomTweet(Text, , OptionArray, Duration, Parameters);    
+EndFunction
+
+// Upload attachments array !NOCLI
+// Uploads files to the server and returns their IDs
+// 
+// Parameters:
+//  ArrayOfFiles - Array from String, BinaryData -  Files array
+//  AttachmentsType  - String -  Attachments type
+//  Parameters    - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Array Of String -  Media ID array
+Function Upload attachments array(Val ArrayOfFiles, Val AttachmentsType, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(AttachmentsType);
+    OPI_TypeConversion.GetCollection(ArrayOfFiles);
+    
+    MediaArray = New Array;
+    Parameters_  = GetStandardParameters(Parameters);
+    MIS         = "media_id_string";
+    
+    If ValueFilled(ArrayOfFiles) Then
+                 
+        For Each SendingFile In ArrayOfFiles Do
+                       
+            OPI_TypeConversion.GetBinaryData(SendingFile);
+            
+            Response   = UploadMediaFile(SendingFile, AttachmentsType, Parameters_);
+            MediaID = Response[MIS];
+            
+            If Not ValueFilled(MediaID) Then
+                Return Response;
+            EndIf;
+            
+            MediaArray.Add(MediaID);
+            
+        EndDo;
+    
+    EndIf;
+        
+    Return MediaArray;
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function UploadMediaFile(Val File, Val Type, Val Parameters) 
+   
+    OPI_TypeConversion.GetBinaryData(File);
+   
+    RequestType = "POST";    
+    Parameters_ = GetStandardParameters(Parameters);
+    URL        = "https://upload.twitter.com/1.1/media/upload.json";
+     
+    If Type = "tweet_image" Then 
+        
+        Fields = New Structure;
+        Fields.Insert("media_data"    , Base64String(File));
+        Fields.Insert("media_category", Type);
+        
+        Authorization = CreateAuthorizationHeaderV1(Parameters_, Fields, RequestType, URL);        
+        Response       = OPI_Tools.Post(URL, Fields, Authorization, False);
+        
+    Else
+        
+        Response = UploadMediaInParts(File, Type, RequestType, URL, Parameters_);
+        
+    EndIf;
+    
+    Return Response;
+    
+EndFunction
+
+Function UploadMediaInParts(Val File, Val Type, Val RequestType, Val URL, Parameters)
+    
+    Unit          = 1024;
+    Quantity       = 4;
+    MediaKey         = "media_key";
+    MIS              = "media_id_string";
+    Command          = "command";
+    Size           = File.Size();
+    
+    MIMETypeMapping = New Match;
+    MIMETypeMapping.Insert("tweet_image", "image/jpeg");
+    MIMETypeMapping.Insert("tweet_video", "video/mp4");
+    MIMETypeMapping.Insert("tweet_gif"  , "image/gif");
+    
+    ChunkSize  = Quantity * Unit * Unit;
+    ArrayReading = SplitBinaryData(File, ChunkSize);
+    
+    Fields = New Structure;
+    Fields.Insert(Command          , "INIT");
+    Fields.Insert("total_bytes"    , OPI_Tools.NumberToString(Size));
+    Fields.Insert("media_type"     , MIMETypeMapping.Get(Type));
+    Fields.Insert("media_category" , Type);
+    
+    Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, RequestType, URL);
+
+    InitializationResponse = OPI_Tools.Post(URL, Fields, Authorization, False);
+    InitializationKey   = InitializationResponse[MediaKey];
+    InitializationID    = InitializationResponse[MIS];
+    
+    If Not ValueFilled(InitializationKey) Or Not ValueFilled(InitializationID) Then
+        Return InitializationResponse;     
+    EndIf;
+    
+    Counter = 0;
+    
+    For Each Part In ArrayReading Do
+        
+        Fields = New Structure;
+        Fields.Insert(Command           , "APPEND");
+        Fields.Insert("media_key"       , InitializationKey);
+        Fields.Insert("segment_index"   , OPI_Tools.NumberToString(Counter));
+        Fields.Insert("media"           , Part);
+
+        Authorization = CreateAuthorizationHeaderV1(Parameters, New Structure, RequestType, URL);
+        
+        OPI_Tools.PostMultipart(URL, Fields, , , Authorization);
+        
+        Counter = Counter + 1;
+        
+    EndDo;
+    
+    Fields = New Structure;
+    Fields.Insert(Command   , "FINALIZE");
+    Fields.Insert("media_id", InitializationID);
+    
+    ProcessingStatus = GetProcessingStatus(Parameters, Fields, URL);
+    
+    If Not TypeValue(ProcessingStatus) = Type("String") Then
+        Return ProcessingStatus;
+    EndIf;
+            
+    Response = WaitForProcessingCompletion(ProcessingStatus, InitializationID, URL, Parameters);
+    
+    Return Response;
+        
+EndFunction
+
+Function WaitForProcessingCompletion(Val ProcessingStatus, Val InitializationID, Val URL, Val Parameters)
+    
+    ProcessingInfo   = "processing_info";
+    Command          = "command";
+    Fields             = New Structure;
+    
+    Fields.Insert(Command   , "STATUS");
+    Fields.Insert("media_id", InitializationID);
+
+    WHile String(ProcessingStatus) = "pending" Or String(ProcessingStatus) = "in_progress" Do
+         
+        Authorization     = CreateAuthorizationHeaderV1(Parameters, Fields, "GET", URL);        
+        Response           = OPI_Tools.Get(URL, Fields, Authorization);     
+        Information      = Response[ProcessingInfo];
+
+        If Not ValueFilled(Information) Then
+            Return Response;
+        EndIf;
+        
+        ProcessingStatus = Information["state"];
+        
+        If Not ValueFilled(ProcessingStatus) Then
+            Return Response;
+        EndIf;
+       
+    EndDo;
+    
+    If ProcessingStatus = "failed" Then
+        Raise "Twitter could not process the video you uploaded";
+    EndIf;
+    
+    Return Response;
+    
+EndFunction
+
+Function GetStandardParameters(Val Parameters = "")
+    
+    // Зdеwithь withобрано опреdеление data, необхоdимых for work.
+    // For Twitter this dоinольно зtoчительный toбор, which is due to the presence of two at once API,
+    // toоторые, при thisм, withозdаны не for разныз заdач, но проwithто яinляютwithя inерwithиями dруг dруга.
+    // Аtoтуальной inерwithией API яinляетwithя v2 и оto требует получения inременных тоtoеноin. Notwithмотря to то,
+    // that Twitter insists on using this latest version, they somehow managed not to transfer
+    // file upload mechanism and some others from the old version - v1.1. Therefore, something needs to be done 
+    // to inерwithии 1.1, and something on 2: up to the point that they removed the ability to post tweets from v1.1,
+    // but only through it you can add a picture to the tweet. At the same time, their authentication methods and tokens are different
+    
+    // Мироinая гигоtoорпорация Andлоto Маwithtoа, towithтати, toпомиtoю ;)
+    
+    // P.S Далее чаwithто упомиtoетwithя "withтраница towithтроеto Twitter Developer" - this 
+    // https://developer.twitter.com/en/portal/dashboard и inыбор toонtoретного проеtoта from withпиwithtoа (зtoчеto c toлючем)
+    
+    Parameters_ = New Match; 
+    Permissions = "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";    
+               
+    // Data for API v2
+        
+    // redirect_uri  - URL of your http service (or other request handler) for authorization
+    // scope         - a set of permissions for the received key. Can be any, but offline.access is mandatory
+    // client_id     - From OAuth 2.0 Client ID and Client Secret settings page of Twitter Developer
+    // client_secret - From OAuth 2.0 Client ID and Client Secret settings page of Twitter Developer
+    // access_token  - GetAuthorizationLink() -> Браузер -> code приdет to redirect_uri -> GetToken(code)
+    // refresh_token - Comes together with access_token and is used to refresh it (access_token lifetime - 2 ч)
+    //                 Обноinление проиwithхоdит метоdом RefreshToken with ноinыми access_token и refresh_token. 
+    //                 For the next update, you need to use a new refresh_token, so hardcode 
+    //                 не получитwithя (access_token тоже не получитwithя) 
+    
+    //           |--> RefreshToken() ->| access_token --> Used in the interval of 2 hours for requests
+    //           |                      |refresh_token --|
+    //           |--------[after 2 hrs.]-------------------|
+     
+    // Data for API v1.1
+    
+    // oauth_token           - From Authentication Tokens -> Access Token and Secret settings page of Twitter Developer 
+    // oauth_token_secret    - From Authentication Tokens -> Access Token and Secret settings page of Twitter Developer
+    // oauth_consumer_key    - From Consumer Keys -> Access Token and Secret settings page of Twitter Developer
+    // oauth_consumer_secret - From Consumer Keys -> Access Token and Secret settings page of Twitter Developer
+    
+    // These tokens do not need to be updated
+    
+    Parameters_.Insert("redirect_uri"         , "");
+    Parameters_.Insert("scope"                , Permissions);
+    Parameters_.Insert("client_id"            , "");
+    Parameters_.Insert("client_secret"        , "");
+    Parameters_.Insert("access_token"         , ""); // Should be something like Constants.TwitterToken.Get()
+    Parameters_.Insert("refresh_token"        , ""); // Should be something like Constants.TwitterRefresh.Get()
+    Parameters_.Insert("oauth_token"          , "");
+    Parameters_.Insert("oauth_token_secret"   , "");
+    Parameters_.Insert("oauth_consumer_key"   , "");
+    Parameters_.Insert("oauth_consumer_secret", "");
+    
+    OPI_TypeConversion.GetCollection(Parameters);
+    
+    If TypeValue(Parameters) = Type("Structure") Or TypeValue(Parameters) = Type("Match") Then
+        For Each PassedParameter In Parameters Do
+            Parameters_.Insert(PassedParameter.Key, OPI_Tools.NumberToString(PassedParameter.Value));
+        EndDo;
+    EndIf;
+
+    Return Parameters_;
+
+EndFunction
+
+Function CreateAuthorizationHeaderV1(Val Parameters, Val Fields, Val RequestType, Val URL)
+    
+    CurrentDate          = OPI_Tools.GetCurrentDate();
+    AuthorizationHeader = "";
+    HashingMethod     = "HMAC-SHA1";
+    APIVersion            = "1.0";
+    SignatureString      = "";
+    Signature              = "";
+    OCK                  = "oauth_consumer_key";
+    OTK                  = "oauth_token";
+    CurrentUNIXDate      = OPI_Tools.UNIXTime(CurrentDate);
+    CurrentUNIXDate      = OPI_Tools.NumberToString(CurrentUNIXDate);
+    ParametersTable    = New ValueTable;
+    ParametersTable.Columns.Add("Key");
+    ParametersTable.Columns.Add("Value");
+        
+    For Each Field In Fields Do 
+        
+        NewLine = ParametersTable.Add();    
+        NewLine.Key     = Field.Key;
+        NewLine.Value = Field.Value;
+        
+    EndDo;
+    
+    NewLine = ParametersTable.Add();
+    NewLine.Key     = OCK;
+    NewLine.Value = Parameters[OCK];
+    
+    NewLine = ParametersTable.Add();
+    NewLine.Key     = OTK;
+    NewLine.Value = Parameters[OTK];
+    
+    NewLine = ParametersTable.Add();
+    NewLine.Key     = "oauth_version";
+    NewLine.Value = APIVersion;
+    
+    NewLine = ParametersTable.Add();
+    NewLine.Key     = "oauth_signature_method";
+    NewLine.Value = HashingMethod;
+
+    NewLine = ParametersTable.Add();
+    NewLine.Key     = "oauth_timestamp";
+    NewLine.Value = CurrentUNIXDate;
+
+    NewLine = ParametersTable.Add();
+    NewLine.Key     = "oauth_nonce";
+    NewLine.Value = CurrentUNIXDate;
+
+    For Each TableRow In ParametersTable Do
+        
+        TableRow.Key     = EncodeString(TableRow.Key, StringEncodingMethod.URLencoding);
+        TableRow.Value = EncodeString(TableRow.Value, StringEncodingMethod.URLencoding);
+        
+    EndDo;
+    
+    ParametersTable.Sort("Key");
+    
+    For Each TableRow In ParametersTable Do
+        
+        SignatureString = SignatureString 
+            + TableRow.Key 
+            + "="
+            + TableRow.Value
+            + "&";
+            
+    EndDo;
+    
+    SignatureString = Left(SignatureString, StrLength(SignatureString) - 1);
+    SignatureString = inReg(RequestType) 
+        + "&" 
+        + EncodeString(URL, StringEncodingMethod.URLencoding)
+        + "&"
+        + EncodeString(SignatureString, StringEncodingMethod.URLencoding);
+        
+    Signature = EncodeString(Parameters["oauth_consumer_secret"], StringEncodingMethod.URLencoding)
+        + "&" 
+        + EncodeString(Parameters["oauth_token_secret"], StringEncodingMethod.URLencoding);
+             
+    Signature = OPI_Cryptography.HMAC(GetBinaryDataFromString(Signature)
+        , GetBinaryDataFromString(SignatureString)
+        , HashFunction.SHA1
+        , 64);
+        
+    Signature = EncodeString(Base64String(Signature), StringEncodingMethod.URLencoding);
+    
+    Delimiter          = """,";
+    AuthorizationHeader = AuthorizationHeader 
+        + "OAuth "
+        + "oauth_consumer_key="""      + Parameters[OCK]        + Delimiter
+        + "oauth_token="""             + Parameters[OTK]        + Delimiter
+        + "oauth_signature_method="""  + HashingMethod      + Delimiter
+        + "oauth_timestamp="""         + CurrentUNIXDate       + Delimiter
+        + "oauth_nonce="""             + CurrentUNIXDate       + Delimiter
+        + "oauth_version="""           + APIVersion             + Delimiter
+        + "oauth_signature="""         + Signature;
+        
+        HeaderMapping = New Match;
+        HeaderMapping.Insert("authorization", AuthorizationHeader);
+        
+    Return HeaderMapping;
+        
+EndFunction
+
+Function CreateAuthorizationHeaderV2(Val Parameters)
+    
+    ReturnMapping = New Match;
+    ReturnMapping.Insert("Authorization", "Bearer " + Parameters["access_token"]);
+    
+    Return ReturnMapping;
+    
+EndFunction
+
+Function GetProcessingStatus(Val Parameters, Val Fields, Val URL)
+
+	ProcessingInfo   = "processing_info";
+    Authorization = CreateAuthorizationHeaderV1(Parameters, Fields, "POST", URL);
+    
+    Response      = OPI_Tools.Post(URL, Fields, Authorization, False);  
+    Information = Response[ProcessingInfo];
+    
+    If Not ValueFilled(Information) Then
+    	Return Response;
+    EndIf;
+    
+    ProcessingStatus = Information["state"];
+    
+    If Not ValueFilled(ProcessingStatus) Then
+    	Return Response;
+    Else
+    	Return ProcessingStatus;
+    EndIf;	
+    
+EndFunction
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
new file mode 100644
index 0000000000..c6382a73c3
--- /dev/null
+++ b/service/interim/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>Methodы work with Twitter (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_VK/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_VK/Module.bsl
new file mode 100644
index 0000000000..4881808620
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_VK/Module.bsl
@@ -0,0 +1,2190 @@
+// Location OS: ./OInt/core/Modules/OPI_VK.os
+// Library: VK
+// CLI Command: 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
+// If in не зtoете with чего toчать, то withтоит toйти метоd GetStandardParameters()
+// and read comments
+
+// 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region TokenRetrieval
+
+// Create token retrieval link
+// Getting a link for interactive token retrieval (access_token), which is necessary
+// for further actions
+// 
+// Parameters:
+//  app_id - String, Number - app_id from application settings - app
+// 
+// Return value:
+//  String - URL to go to in the browser 
+Function CreateTokenRetrievalLink(Val App_id) Export
+    
+    OPI_TypeConversion.GetLine(App_id);
+    
+    // access_token will need to be taken from the parameter in the browser address bar
+    Return "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";
+        
+EndFunction
+ 
+#EndRegion
+
+#Region GroupWork
+
+// Create post
+// Creates a post with images
+// 
+// Parameters:
+//  Text              - String                          - Post text                           - text
+//  ImageArray     - Array from String, BinaryData - Array of images                       - pictures  
+//  Advertisement            - Boolean                          - Indication ""Это реtoлама""               - ad
+//  LinkUnderPost   - String                          - Link (URL) under the post              - url
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreatePost(Val Text
+    , Val ImageArray
+    , Val Advertisement = False
+    , Val LinkUnderPost = ""
+    , Val Parameters = "") Export
+        
+    OPI_TypeConversion.GetCollection(ImageArray);
+ 
+    Parameters_      = GetStandardParameters(Parameters);
+    AttachmentsArray  = New Array;    
+        
+    For Each PostImage In ImageArray Do
+        
+        Parameters_        = GetStandardParameters(Parameters);
+        ResponseCorrespondence = GetImageCorrespondence(PostImage, Parameters_, "Post");
+        
+        OwnerId  = ResponseCorrespondence.Get("owner_id");
+        ObjectId = ResponseCorrespondence.Get("id");
+        
+        If Not ValueFilled(OwnerId) Or Not ValueFilled(ObjectId) Then
+        	Return ResponseCorrespondence;
+        EndIf;
+        
+        OwnerId  = OPI_Tools.NumberToString(OwnerId);
+        ObjectId = OPI_Tools.NumberToString(ObjectId);
+        
+        PhotoID = "photo" + OwnerId + "_" + ObjectId; 
+
+        AttachmentsArray.Add(PhotoID);
+        
+    EndDo;
+
+    Response = CreateCompositePost(Text, AttachmentsArray, Advertisement, LinkUnderPost, Parameters);
+    
+    Return Response;
+    
+EndFunction
+
+// Create composite post
+// Созdает поwithт to mainоinе маwithwithиinа иdетифиtoатороin объеtoтоin (toартиноto, inиdео и dр.)
+// 
+// Parameters:
+//  Text            - String           - Post text                              - text
+//  Objects          - Array of Strings - Array of identifiers like photo123_123 - objects  
+//  Advertisement          - Boolean           - Indication ""Это реtoлама""                  - ad
+//  LinkUnderPost - String           - Link (URL) under the post                 - url
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreateCompositePost(Val Text
+    , Val Objects
+    , Val Advertisement = False
+    , Val LinkUnderPost = ""
+    , Val Parameters = "") Export
+   
+    OPI_TypeConversion.GetLine(Text);
+    OPI_TypeConversion.GetLine(LinkUnderPost);   
+    OPI_TypeConversion.GetBoolean(Advertisement);
+    
+    Parameters      = GetStandardParameters(Parameters);
+    AttachmentsString = StrJoin(Objects, ",");   
+    AttachmentsString = AttachmentsString + LinkUnderPost;
+    
+    Parameters.Insert("message"            , Text);
+    Parameters.Insert("attachments"        , AttachmentsString);
+    Parameters.Insert("mark_as_ads"        , ?(Advertisement, 1, 0));
+    Parameters.Insert("close_comments"     , ?(Advertisement, 1, 0));
+
+    Response = OPI_Tools.Get("api.vk.com/method/wall.post", Parameters);
+    
+    Return Response;
+     
+EndFunction
+
+// Delete post
+// Deletes a post by ID
+//
+// Parameters:
+//  PostID    - String, Number - Post ID - post
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function DeletePost(Val PostID, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(PostID);
+    
+    Parameters_  = GetStandardParameters(Parameters);    
+    Parameters_.Insert("post_id", PostID);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/wall.delete", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Create poll
+// Creates a poll with answer options
+//
+// Parameters:
+//  Question        - String                - Poll question              - question
+//  AnswersArray - Array of Strings      - Array of answer options    - options
+//  Image      - String, BinaryData - Poll image            - picture
+//  Parameters  - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreatePoll(Val Question, Val AnswersArray, Val Image = "", Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Question);
+    OPI_TypeConversion.GetCollection(AnswersArray);
+    
+    Parameters_    = GetStandardParameters(Parameters);
+    Response      = "response";
+
+    If ValueFilled(Image) Then
+        
+        Response  = UploadPhotoToServer(Image, Parameters_, "Poll");
+        
+        Photo   = Response.Get(Response);
+        
+        If ValueFilled(Photo) Then
+        	
+        	PhotoID = Photo["id"];
+        	
+        	If Not ValueFilled(PhotoID) Then
+            	Return Response;
+        	EndIf;
+        	
+        Else
+            Return Response;
+        EndIf;
+    
+    EndIf;
+    
+    Parameters_.Insert("is_anonymous", 1);
+    Parameters_.Insert("is_multiple" , 0);
+        
+    Answers = StrJoin(AnswersArray, """,""");
+    Answers = "[""" + Answers + """]";    
+        
+    Parameters_.Insert("add_answers", Answers);
+    Parameters_.Insert("photo_id"   , OPI_Tools.NumberToString(PhotoID));
+    Parameters_.Insert("question"   , Question);
+    
+    Poll             = OPI_Tools.Get("api.vk.com/method/polls.create", Parameters_);
+    PollCorrespondence = Poll.Get(Response);
+    
+    If Not ValueFilled(PollCorrespondence) Then
+    	Return Poll;
+    EndIf;
+    
+    OwnerId  = PollCorrespondence.Get("owner_id");
+    ObjectId = PollCorrespondence.Get("id");
+    
+    If Not ValueFilled(OwnerId) Or Not ValueFilled(ObjectId) Then
+        Return Poll;
+    EndIf;
+    
+    PollID = "poll"
+    + OPI_Tools.NumberToString(OwnerId)
+    + "_" 
+    + OPI_Tools.NumberToString(ObjectId);
+ 
+    Parameters_.Insert("attachments", PollID);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/wall.post", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Create album
+// Creates an album to store images
+//
+// Parameters:
+//  Name - String - Album name - title
+//  Description     - String - Album description     - description
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreateAlbum(Val Name, Val Description = "", Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Name);
+    OPI_TypeConversion.GetLine(Description);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    
+    Parameters_.Insert("title"                , Name);
+    Parameters_.Insert("description"          , Description);
+    Parameters_.Insert("upload_by_admins_only", 1);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/photos.createAlbum", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Delete album
+// Deletes a previously created album
+//
+// Parameters:
+//  AlbumID - String, Number        - Album ID - album
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function DeleteAlbum(Val AlbumID, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(AlbumID);
+    
+    Parameters_  = GetStandardParameters(Parameters);    
+    Parameters_.Insert("album_id", OPI_Tools.NumberToString(AlbumID));
+    
+    Response = OPI_Tools.Get("api.vk.com/method/photos.deleteAlbum", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Create story
+// Creates a story from an image
+//
+// Parameters:
+//  Image     - String, BinaryData - Story background                           - picture
+//  URL          - String                - URL for button under the story           - url
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreateStory(Val Image, Val URL = "", Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(URL);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("link_text"  , "more");
+    Parameters_.Insert("link_url"   , URL);
+    Parameters_.Insert("add_to_news", "1");
+    
+    Response = UploadPhotoToServer(Image, Parameters_, "Story");    
+    Return Response;
+    
+EndFunction
+
+// Save image to album
+// Saves an image to the community album
+//
+// Parameters:
+//  AlbumID - String, Number          - Album ID        - album                           
+//  Image  - BinaryData,String - Image file     - picture
+//  Description  - String                - Image description - description
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function SaveImageToAlbum(Val AlbumID, Val Image, Val Description = "", Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(AlbumID);
+    OPI_TypeConversion.GetLine(Description);
+    
+    Parameters_      = GetStandardParameters(Parameters);
+    
+    Parameters_.Insert("album_id", AlbumID);
+    Parameters_.Insert("caption" , Description);
+          
+    Return UploadPhotoToServer(Image, Parameters_, "Album");
+    
+EndFunction
+
+// Delete image
+// Deletes an image from the album
+//
+// Parameters:
+//  ImageID - String, Number       - Image ID - pictureid 
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function DeleteImage(Val ImageID, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(ImageID);
+    
+    Parameters_  = GetStandardParameters(Parameters);
+    Parameters_.Insert("photo_id", ImageID);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/photos.delete", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Upload video to server
+// Uploads video to the group for further use
+// 
+// Parameters:
+//  Video        - String, BinaryData - Video file                  - file
+//  Name - String                 - Video name          - title
+//  Description     - String                 - Video description              - description
+//  Album       - String                 - Album ID, if necessary - album
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK 
+Function UploadVideoToServer(Val Video
+    , Val Name
+    , Val Description = ""
+    , Val Album = ""
+    , Val Parameters = "") Export
+	
+	String_   = "String";
+	Parameters = GetStandardParameters(Parameters);
+	
+	OPI_Tools.AddField("name"       , Name, String_, Parameters);
+	OPI_Tools.AddField("description", Description    , String_, Parameters);
+	OPI_Tools.AddField("album_id"   , Album      , String_, Parameters);
+	
+	Response = OPI_Tools.Get("api.vk.com/method/video.save", Parameters);
+    
+    Result = Response["response"];
+    
+    If Not ValueFilled(Result) Then
+		Return Response;
+    EndIf;
+    
+	URL = Result["upload_url"];
+	
+	If Not ValueFilled(URL) Then
+		Return Response;
+	EndIf;
+    
+    FileMapping = New Match;
+    OPI_Tools.AddField("video_file.mp4", Video, "BinaryData", FileMapping);
+    
+    DataSize = FileMapping["video_file.mp4"].Size();
+    DataSize = OPI_Tools.NumberToString(DataSize);
+    
+    Response = OPI_Tools.PostMultipart(URL, , FileMapping, "video/mp4");
+    
+    Return Response;
+    
+EndFunction
+
+// Upload photo to server
+// Uploads photo to server for further use
+// 
+// Parameters:
+//  Image  - String, BinaryData - Image file                   - file
+//  Parameters - Structure Of String    - See GetStandardParameters - auth - Authorization JSON or path to .json
+//  View       - String                 - View upload (Post, Product, Story, Poll, Miscellaneous) - type
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK 
+Function UploadPhotoToServer(Val Image, Val Parameters = "", Val View = "Post") Export
+       
+    Parameters  = GetStandardParameters(Parameters);
+    Method      = DetermineImageUploadMethod(View);
+    Files      = New Match;
+    
+    Response   = "response";
+    URL        = "api.vk.com/method/";
+    Upload   = URL + Method["Upload"];
+    Save = URL + Method["Save"];
+    
+    If TypeValue(Image) = Type("String") Then
+        ImageKey        = StringReplace(Image, ".", "___");
+        OPI_TypeConversion.GetBinaryData(Image);
+    Else
+        ImageKey        = "image___jpeg";
+    EndIf;
+    
+    Files.Insert(ImageKey, Image);
+    
+    For N = 1 For 5 Do
+        
+        Response     = OPI_Tools.Get(Upload, Parameters);  
+        Result = Response[Response];
+        
+        If ValueFilled(Result) Then
+            
+            URL = Result["upload_url"];
+            
+            If Not ValueFilled(URL) Then
+                Return Response;
+            EndIf;
+            
+        Else
+            Return Response;
+        EndIf;
+        
+        Parameters.Insert("upload_url", URL);
+        Response = OPI_Tools.PostMultipart(URL, Parameters, Files);
+        
+        If TypeValue(Response) = Type("Match") Then
+            Break;
+        EndIf;
+        
+    EndDo;
+    
+    If TypeValue(Response) <> Type("Match") Then
+        Return GetStringFromBinaryData(Response);
+    EndIf;
+
+    FillPhotoUploadParameters(Method, Response, Parameters);
+        
+    Response = OPI_Tools.Get(Save, Parameters);
+          
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region DiscussionManagement
+
+// Create discussion
+// Creates a new discussion
+//
+// Parameters:
+//  Name          - String  - Discussion name - title
+//  Text of the first message - String  - Text of the first message - text
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreateDiscussion(Val Name, Val Text of the first message, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Name);
+    OPI_TypeConversion.GetLine(Text of the first message);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("title", Name);
+    Parameters_.Insert("text" , Text of the first message);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/board.addTopic", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Close discussion
+// Close or delete discussion
+//
+// Parameters:
+//  DiscussionID     - String, Number - Discussion ID                                          - topic
+//  Delete completely - Boolean       -  Delete completely (True) or close                - remove
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CloseDiscussion(Val DiscussionID, Val Delete completely = False, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(DiscussionID);
+    OPI_TypeConversion.GetBoolean(Delete completely);
+    
+    Parameters_  = GetStandardParameters(Parameters);
+    Parameters_.Insert("topic_id", DiscussionID);
+    
+    Method = ?(Delete completely, "deleteTopic", "closeTopic");   
+    Response = OPI_Tools.Get("api.vk.com/method/board." + Method, Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+// Open discussion
+// Opens a previously closed discussion
+//
+// Parameters:
+//  DiscussionID - String, Number - Discussion ID - topic
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function OpenDiscussion(Val DiscussionID, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(DiscussionID);
+    
+    Parameters_  = GetStandardParameters(Parameters);
+    Parameters_.Insert("topic_id", DiscussionID);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/board.openTopic", Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+// Write in discussion
+// Adds a message to the discussion on behalf of the group
+//
+// Parameters:
+//  DiscussionID - String, Number - Discussion ID   - topic
+//  Text        - String       - Message text - text
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function WriteInDiscussion(Val DiscussionID, Val Text, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(DiscussionID);
+    OPI_TypeConversion.GetLine(Text);
+    
+    Parameters_  = GetStandardParameters(Parameters);
+    Parameters_.Insert("topic_id", DiscussionID);
+    Parameters_.Insert("message" , Text);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/board.createComment", Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region InteractiveActions
+
+// Like
+// Likes a post
+//
+// Parameters:
+//  PostID   - String, Number - Post ID                    - post
+//  WallID   - String, Number - ID of the wall where the post is located - wall
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function LikePost(Val PostID, Val WallID = "", Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(PostID);
+    OPI_TypeConversion.GetLine(WallID);
+    
+    Parameters_      = GetStandardParameters(Parameters);
+    WallID         = ?(ValueFilled(WallID), WallID, Parameters_["owner_id"]);
+    VKObject        = "wall" + WallID + "_" + OPI_Tools.NumberToString(PostID);
+    
+    Parameters_.Insert("type"        , "post");
+    Parameters_.Insert("object"      , VKObject);
+    Parameters_.Insert("item_id"     , OPI_Tools.NumberToString(PostID));
+    Parameters_.Insert("owner_id"    , OPI_Tools.NumberToString(WallID));
+    Parameters_.Insert("from_group"  , 0);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/likes.add", Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+// Make repost
+// Reposts the record
+//
+// Parameters:
+//  PostID      - String, Number - Post ID                      - post
+//  WallID      - String, Number -  ID of the wall where the post is located  - from
+//  Target wall - String, Number -  ID of the target wall or group  - to
+//  Advertising    - Boolean -  Sign of an advertising post           - ad
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function MakeRepost(Val PostID
+    , Val WallID = ""
+    , Val Target wall = ""
+    , Val Advertising = False
+    , Val Parameters = "") Export
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    GroupId    = Parameters_["group_id"];
+    
+    OPI_TypeConversion.GetLine(GroupId);
+    OPI_TypeConversion.GetLine(PostID);
+    OPI_TypeConversion.GetLine(WallID);
+    OPI_TypeConversion.GetLine(Target wall);
+    OPI_TypeConversion.GetBoolean(Advertising);
+       
+    Source    = ?(ValueFilled(WallID), WallID, GroupId);       
+    Receiver    = ?(ValueFilled(Target wall), Target wall, GroupId);
+
+    Parameters_.Insert("object"          , "wall" + Source + "_" + OPI_Tools.NumberToString(PostID));
+    Parameters_.Insert("group_id"        , StringReplace(Receiver, "-", ""));
+    Parameters_.Insert("mark_as_ads"     , ?(Advertising, 1, 0));
+    
+    Response = OPI_Tools.Get("api.vk.com/method/wall.repost", Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+// Write a message
+// Write a message to a user in the community's dialog
+//
+// Parameters:
+//  Text          - String - Message text                                                 - text
+//  UserID - String - Recipient user ID                                        - user
+//  Communitytoken - String - Community chat bot token, which can be obtained in the settings  - ct
+//  Keyboard     - String - JSON keyboard. See FormKeyboard                      - keyboard
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function WriteMessage(Val Text
+    , Val UserID
+    , Val Communitytoken
+    , Val Keyboard = ""
+    , Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Text);
+    OPI_TypeConversion.GetLine(UserID);
+    OPI_TypeConversion.GetLine(Communitytoken);
+    OPI_TypeConversion.GetLine(Keyboard);
+    
+    Parameters_  = GetStandardParameters(Parameters);
+    Parameters_.Insert("access_token", Communitytoken);
+    
+    Parameters_.Insert("user_id"     , UserID);
+    Parameters_.Insert("peer_id"     , UserID);
+    Parameters_.Insert("parse_mode"  , "Markdown"); 
+    Parameters_.Insert("random_id"   , 0);
+    Parameters_.Insert("message"     , Text);
+    
+    If ValueFilled(Keyboard) Then
+        Parameters_.Insert("keyboard", Keyboard);
+    EndIf;
+    
+    Response = OPI_Tools.Get("api.vk.com/method/messages.send", Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+// Write a comment
+// Creates a comment under the selected record
+//
+// Parameters:
+//  PostID   - String, Number - ID of the target post            - post
+//  WallID   - String, Number -  ID of the wall where the post is located - wall
+//  Text     - String       - Comment text            - text
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function WriteComment(Val PostID, Val WallID, Val Text, Val Parameters = "") Export
+
+    Parameters_ = GetStandardParameters(Parameters);
+    GroupId    = Parameters_["group_id"];
+    
+    OPI_TypeConversion.GetLine(GroupId);
+    OPI_TypeConversion.GetLine(PostID);
+    OPI_TypeConversion.GetLine(WallID);
+    OPI_TypeConversion.GetLine(Text);
+       
+    Parameters_.Insert("owner_id"   , WallID); 
+    Parameters_.Insert("from_group" , GroupId);
+    Parameters_.Insert("post_id"    , PostID);
+    Parameters_.Insert("message"    , Text);
+    
+    Parameters_.Delete("group_id");
+    
+    Response = OPI_Tools.Get("api.vk.com/method/wall.createComment", Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+// Shorten link
+// Creates a shortened URL from a regular one
+//
+// Parameters:
+//  URL       - String - URL for shortening - url
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+// String - Shortened URL 
+Function ShortenLink(Val URL, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(URL);
+    
+    Response   = "response";
+    Parameters_ = New Structure;
+    Parameters_ = GetStandardParameters(Parameters);    
+    Parameters_.Insert("url", URL);
+    
+    Response     = OPI_Tools.Get("https://api.vk.com/method/utils.getShortLink", Parameters_);
+    Result = Response[Response];
+    
+    If ValueFilled(Result) Then
+    	
+    	URL = Result["short_url"];
+    	
+    	If ValueFilled(URL) Then
+    		Return URL;
+    	Else
+    		Return Response;
+    	EndIf;
+    	
+    Else
+    	Return Response;
+    EndIf;
+      
+EndFunction
+
+#EndRegion
+
+#Region Statistics
+
+// Get statistics
+// Gets the overall community statistics for a period
+//
+// Parameters:
+//  StartDate    - Date - Start date of the period    - datefrom
+//  EndDate - Date - End date of the period - dateto
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function GetStatistics(Val StartDate, Val EndDate, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetDate(StartDate);
+    OPI_TypeConversion.GetDate(EndDate);
+    
+    Parameters_         = GetStandardParameters(Parameters);
+    
+    StartDate         = OPI_Tools.UNIXTime(StartDate);
+    EndDate      = OPI_Tools.UNIXTime(EndDate);
+    
+    Parameters_.Insert("timestamp_from", StartDate);
+    Parameters_.Insert("timestamp_to"  , EndDate);
+    Parameters_.Insert("stats_groups"  , "visitors, reach, activity");
+    
+    Response = OPI_Tools.Get("api.vk.com/method/stats.get", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Get post statistics
+// Gets statistics in terms of posts
+//
+// Parameters:
+//  Array of post IDs - Array of String,Number - Array of post IDs - posts
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Array of Arbitrary -  Array of post statistics data
+Function GetPostStatistics(Val Array of post IDs, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetCollection(Array of post IDs);
+    
+    Parameters_       = GetStandardParameters(Parameters);
+    AnswersArray    = New Array;
+    Array of Sets     = New Array;
+    MaximumPosts   = 30;
+    Response         = "response";
+    
+    For Each Post In Array of post IDs Do
+        
+        Array of Sets.Add(OPI_Tools.NumberToString(Post));
+        
+        If Array of Sets.Quantity() = MaximumPosts Then
+            
+            NumbersString = StrJoin(Array of Sets, ",");
+            Parameters_.Insert("post_ids", NumbersString);
+            
+            Statistics             = OPI_Tools.Get("api.vk.com/method/stats.getPostReach", Parameters_);
+            Array of Statistics       = Statistics[Response];
+            
+            For Each StatisticsItem In Array of Statistics Do
+                AnswersArray.Add(StatisticsItem);
+            EndDo;
+            
+            Array of Sets = New Array;
+            
+        EndIf;
+        
+    EndDo;
+    
+    NumbersString = StrJoin(Array of Sets, ",");
+    Parameters_.Insert("post_ids", NumbersString);
+    
+    Statistics       = OPI_Tools.Get("api.vk.com/method/stats.getPostReach", Parameters_);
+    Array of Statistics = Statistics[Response];
+    
+    If TypeValue(Array of Statistics) = Type("Array") Then
+        For Each StatisticsItem In Array of Statistics Do
+            AnswersArray.Add(StatisticsItem);
+        EndDo;
+    EndIf;
+
+    Return AnswersArray;
+    
+EndFunction
+        
+#EndRegion
+
+#Region AdAccountManagement
+
+// Create advertising campaign
+// Creates a campaign in the selected advertising account
+//
+// Parameters:
+//  AccountID   - String, Number - Advertising account ID - cabinet
+//  Name - String       - Campaign name - title
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreateAdvertisingCampaign(Val AccountID, Val Name, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(AccountID);
+    OPI_TypeConversion.GetLine(Name);
+    
+    CurrentDate  = OPI_Tools.GetCurrentDate();
+    EndDate = AddMonth(CurrentDate, 24);
+    
+    Parameters_  = GetStandardParameters(Parameters);    
+    Parameters_.Insert("account_id", AccountID);
+    
+    Array of Structures = New Array;
+    StartDate      = OPI_Tools.UNIXTime(CurrentDate);
+    EndDate       = OPI_Tools.UNIXTime(EndDate);
+    
+    CampaignStructure = New Structure;
+    CampaignStructure.Insert("type"            , "promoted_posts");
+    CampaignStructure.Insert("name"            , Name);
+    CampaignStructure.Insert("day_limit"       , 0);
+    CampaignStructure.Insert("all_limit"       , 0);
+    CampaignStructure.Insert("start_time"      , StartDate);
+    CampaignStructure.Insert("stop_time"       , EndDate);
+    CampaignStructure.Insert("status"          , 1);
+    
+    Array of Structures.Add(CampaignStructure);
+    
+    JSONDate = OPI_Tools.JSONString(Array of Structures);
+    
+    Parameters_.Insert("data", JSONDate);
+    
+    Response    = OPI_Tools.Get("api.vk.com/method/ads.createCampaigns", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Create advertising post
+// Creates an advertising post based on a post
+//
+// Parameters:
+//  CampaignNumber  - String, Number - Advertising campaign ID                         - campaign
+//  DailyLimit   - String, Number - Daily limit in rubles                        - limit
+//  CategoryNumber - String, Number - Advertising category number                     - category
+//  PostID        - String, Number - ID of the post used for advertising    - post
+//  AccountID     - String, Number - Advertising account ID                        - cabinet
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreateAd(Val CampaignNumber
+    , Val DailyLimit
+    , Val CategoryNumber
+    , Val PostID
+    , Val AccountID
+    , Val Parameters = "") Export
+    
+    Parameters_  = GetStandardParameters(Parameters);   
+    GroupId     = Parameters_["group_id"];
+    
+    OPI_TypeConversion.GetLine(GroupId);
+    OPI_TypeConversion.GetLine(CampaignNumber);
+    OPI_TypeConversion.GetLine(DailyLimit);
+    OPI_TypeConversion.GetLine(CategoryNumber);
+    OPI_TypeConversion.GetLine(PostID);
+    OPI_TypeConversion.GetLine(AccountID);
+    
+    Link = "https://vk.com/wall-" + GroupId + "_" + PostID;
+    
+    Array of Structures        = New Array;    
+    CampaignStructure     = New Structure;
+    CampaignStructure.Insert("campaign_id"                , CampaignNumber);
+    CampaignStructure.Insert("ad_format"                  , 9);
+    CampaignStructure.Insert("conversion_event_id"        , 1);
+    CampaignStructure.Insert("autobidding"                , 1);
+    CampaignStructure.Insert("cost_type"                  , 3);
+    CampaignStructure.Insert("goal_type"                  , 2);
+    CampaignStructure.Insert("ad_platform"                , "all");
+    CampaignStructure.Insert("publisher_platforms"        , "vk");
+    CampaignStructure.Insert("publisher_platforms_auto"   , "1");
+    CampaignStructure.Insert("day_limit"                  , DailyLimit);
+    CampaignStructure.Insert("all_limit"                  , "0");
+    CampaignStructure.Insert("category1_id"               , CategoryNumber);
+    CampaignStructure.Insert("age_restriction"            , 0);
+    CampaignStructure.Insert("status"                     , 1);
+    CampaignStructure.Insert("name"                       , "Ad");
+    CampaignStructure.Insert("link_url"                   , Link);
+    
+    Array of Structures.Add(CampaignStructure);
+    
+    OPI_TypeConversion.GetLine(Array of Structures, True);
+    
+    Parameters_.Insert("data"        , Array of Structures);
+    Parameters_.Insert("account_id"  , AccountID);
+    
+    Response    = OPI_Tools.Get("api.vk.com/method/ads.createAds", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Pause advertising post
+// Pauses the display of the advertising post
+//
+// Parameters:
+//  AccountID   - String, Number - Advertising account ID - cabinet
+//  AdID - String, Number - Ad ID          - adv 
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function PauseAdvertisingAd(Val AccountID, Val AdID, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(AccountID);
+    OPI_TypeConversion.GetLine(AdID);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+
+    Parameters_.Insert("account_id", AccountID);
+    
+    Array of Structures    = New Array;    
+    CampaignStructure = New Structure;
+    
+    CampaignStructure.Insert("ad_id"  , AdID);
+    CampaignStructure.Insert("status" , 0);
+    
+    Array of Structures.Add(CampaignStructure);
+    
+    OPI_TypeConversion.GetLine(Array of Structures, True);
+    
+    Parameters_.Insert("data", Array of Structures);
+        
+    Response = OPI_Tools.Get("api.vk.com/method/ads.updateAds", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Get a list of advertising categories
+// Gets a list of advertising category IDs for creating an advertising post
+//
+// Parameters:
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function GetAdvertisingCategoryList(Val Parameters = "") Export
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Response      = OPI_Tools.Get("api.vk.com/method/ads.getCategories", Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region ProductManagement
+
+// Get a list of product categories
+// Gets a list of product category IDs to specify when creating a product
+//
+// Parameters:
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Compliance From String - Key - ID, Value - Name
+Function GetProductCategoryList(Val Parameters = "") Export
+    
+    Response   = "response";
+    Parameters_ = GetStandardParameters(Parameters);
+    Response      = OPI_Tools.Get("api.vk.com/method/market.getCategories", Parameters_);
+    Result  = Response[Response];
+    
+    If ValueFilled(Result) Then
+    	
+    	Quantity = Result["count"];
+    	
+    	If Not ValueFilled(Quantity) Then
+    		Return Response;
+    	EndIf;
+    	
+    Else
+    	Return Response;
+    EndIf;
+    
+    Parameters_.Insert("count", Quantity);
+    Response      = OPI_Tools.Get("api.vk.com/method/market.getCategories", Parameters_);   
+    Result  = Response[Response]; 
+    
+    If ValueFilled(Result) Then
+    	
+    	Categories  = Result["items"];
+    	
+    	If Not ValueFilled(Categories) Then
+    		Return Response;
+    	EndIf;
+    	
+    Else
+    	Return Response;
+    EndIf;
+       
+    CategoryCorrespondence = New Match;
+    
+    For Each Category In Categories Do      
+        CategoryCorrespondence.Insert(Category["id"], Category["name"]);
+    EndDo;
+       
+    Return CategoryCorrespondence;
+    
+EndFunction
+
+// Get product list
+// Gets the community's product list
+//
+// Parameters:
+//  Selection  - String, Number        - Selection ID, if filtering is needed - sel
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Array of product matches
+Function GetProductList(Val Selection = "", Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Selection);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("count"        , 200);
+    Parameters_.Insert("extended"     , 1);
+    Parameters_.Insert("with_disabled", 1);
+    
+    If ValueFilled(Selection) Then
+        Parameters_.Insert("album_id", Selection);  
+    EndIf;
+    
+    Array of products = New Array;
+    GetProductListRecursively(Array of products, Parameters_);
+    
+    Return Array of products;
+    
+EndFunction
+
+// Get products by ID
+// Gets information about products by array of IDs
+//
+// Parameters:
+//  Products    - String, Array of Strings - Array of product IDs - items 
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function GetProductsByID(Val Products, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetCollection(Products);
+    
+    Parameters_    = GetStandardParameters(Parameters);
+    ProductsString = "";
+    Owner         = "owner_id";
+    
+    For Each Product In Products Do       
+        CurrentProduct  = Parameters_[Owner] + "_" + Product;
+        CurrentProduct  = OPI_Tools.NumberToString(CurrentProduct);
+        ProductsString = ProductsString + CurrentProduct + ",";
+    EndDo;
+    
+    ProductsString = Left(ProductsString, StrLength(ProductsString) - 1);
+    Parameters_.Insert("item_ids", ProductsString);
+    Parameters_.Insert("extended", 1);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.getById", Parameters_);
+    
+    Return Response;
+     
+EndFunction
+
+// Add product
+// Adds a new product to the community's catalog
+//
+// Parameters:
+//  ProductDescription - Key-Value Pair - See GetProductDescription - product - JSON description of the product or path
+//  Selection       - String - Selection ID for placing the product, if needed - sel
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function AddProduct(Val ProductDescription, Val Selection = "", Val Parameters = "") Export        
+    Return ProductManagement(ProductDescription, , Selection, Parameters);    
+EndFunction
+
+// Edit product
+// Edits a previously created product
+//
+// Parameters:
+//  Product - Number, String - Identifier of the product being edited - item
+//  ProductDescription - Key-Value Pair - See GetProductDescription - product - JSON description of the product or path
+//  Selection - String - Identifier of the new selection, if needed - sel 
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function EditProduct(Val Product, Val ProductDescription, Val Selection = "", Val Parameters = "") Export
+    Return ProductManagement(ProductDescription, Product, Selection, Parameters);    
+EndFunction
+
+// Delete product
+// Deletes a previously created product
+//
+// Parameters:
+//  Product - String, Number - Product ID - item
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function DeleteProduct(Val Product, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Product);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("item_id", Product);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.delete", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Group products
+// Groups products based on similar sets of properties
+//
+// Parameters:
+//  Array of products      - Array Of String - Array of product IDs                       - items
+//  ExistingGroup - String           - ID of the existing group, if needed - sellgroup
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function GroupProducts(Val Array of products, Val ExistingGroup = "", Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(ExistingGroup);
+    OPI_TypeConversion.GetCollection(Array of products);
+    
+    Parameters_     = GetStandardParameters(Parameters);
+    Array_of_Products = New Array;
+    
+    For Each Product In Array of products Do
+        Array_of_Products.Add(OPI_Tools.NumberToString(Product));
+    EndDo;
+    
+    Products = StrJoin(Array_of_Products, ",");
+    
+    Parameters_.Insert("item_ids", Products);
+    
+    If ValueFilled(ExistingGroup) Then
+        Parameters_.Insert("item_group_id", ExistingGroup);
+    EndIf;
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.groupItems", Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+// Get product description. !NOCLI
+// 
+// Return value:
+//  Key-Value Pair - Empty product description:
+//  *Name - String - Product name
+//  *Description - String - Product description
+//  *Category - String - See GetProductCategoryList
+//  *Price - Number - Product price
+//  *OldPrice - Number - For displaying discount/changing price
+//  *MainPhoto - String, BinaryData - Binary data or path to photo
+//  *URL - String - Link to the store's website page
+//  *AdditionalPhotos - Array Of String - Binary Data or Photo Paths
+//  *PropertyValues - Array Of String - See AddPropertyVariant
+//  *MainInGroup - Boolean - Main in the group, if exists in the group
+//  *Width - Number - Width product in мм.
+//  *Height - Number - Height product in мм.
+//  *Depth - Number - Depth product in мм.
+//  *Weight - Number - Weight in гр.
+//  *SKU - String - SKU
+//  *AvailableBalance - Number - Balance. -1 - unlimited
+Function GetProductDescription() Export
+     
+    Product = New Match();
+    Product.Insert("Name"                , "New product");     // Product name
+    Product.Insert("Description"           , "Product description"); // Product description
+    Product.Insert("Category"          , "20173");           // See GetProductCategoryList()
+    Product.Insert("Price"               , 1);                 // Price.
+    Product.Insert("OldPrice"         , Undefined);      // For reflection change price 
+    Product.Insert("MainPhoto"       , Undefined);      // BD or path to main. photo
+    Product.Insert("URL"                , Undefined);      // Link to page store
+    Product.Insert("AdditionalPhotos" , New Array);      // Array paths or BD for add. photo
+    Product.Insert("PropertyValues"    , New Array);      // Values properties (variants). Maximum 2
+    Product.Insert("MainInGroup"     , False);              // Make main in of its group  
+    Product.Insert("Width"             , Undefined);      // In millimeters
+    Product.Insert("Height"             , Undefined);      // In millimeters
+    Product.Insert("Depth"            , Undefined);      // In millimeters
+    Product.Insert("Weight"                , Undefined);      // In grams
+    Product.Insert("SKU"                , Undefined);      // SKU
+    Product.Insert("AvailableBalance"   , 1);
+    
+    Return Product;
+     
+EndFunction
+
+#EndRegion
+
+#Region ProductSelectionManagement
+
+// Get selection list
+// Gets the list of product selections
+//
+// Parameters:
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Array of selection matches
+Function GetSelectionList(Val Parameters = "") Export
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("count", 100);
+    
+    ArrayOfAlbums = New Array;
+    GetAlbumListRecursively(ArrayOfAlbums, Parameters_);
+    
+    Return ArrayOfAlbums;
+    
+EndFunction
+
+// Get selections by ID
+// Gets the list of selections by array of IDs
+//
+// Parameters:
+//  Selections  - String, Array of Strings - Selection IDs - sels
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function GetSelectionsByID(Val Selections, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetCollection(Selections);
+    
+    Parameters_     = GetStandardParameters(Parameters);    
+    Selections_      = New Array;
+    SelectionsString = "";
+      
+    For Each Selection In Selections Do
+        Selections_.Add(OPI_Tools.NumberToString(Selection));    
+    EndDo;    
+    
+    SelectionsString = StrJoin(Selections_, ",");
+        
+    Parameters_.Insert("album_ids", SelectionsString);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.getAlbumById", Parameters_);
+    
+    Return Response;
+     
+EndFunction
+
+// Create product selection
+// Creates an empty product selection
+//
+// Parameters:
+//  Name  - String                - Selection name - title
+//  Image  - String, BinaryData - Image file     - picture
+//  Main  - Boolean                - Main          - main
+//  Hidden   - Boolean                - Hidden           - hidden
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function CreateProductCollection(Val Name
+    , Val Image
+    , Val Main = False
+    , Val Hidden = False
+    , Val Parameters = "") Export
+    
+    Return SelectionManagement(Name, Image, , Main, Hidden, Parameters);
+    
+EndFunction
+
+// Edit product selection
+// Edits the properties of a product selection
+//
+// Parameters:
+//  Name - String                - New selection name         - title
+//  Selection - String                - Selection ID					   - sel
+//  Image - String, BinaryData - New selection image         - picture
+//  Main - Boolean                - Main                        - main
+//  Hidden  - Boolean                - Hidden                         - hidden
+//  Parameters - Structure Of String  - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function EditProductCollection(Val Name
+    , Val Selection
+    , Val Image = ""
+    , Val Main = False
+    , Val Hidden = False
+    , Val Parameters = "") Export
+    
+    Return SelectionManagement(Name, Image, Selection, Main, Hidden, Parameters);
+    
+EndFunction
+
+// Add product to selection
+// Adds a product to the selection
+//
+// Parameters:
+//  Array of products - Array of string, number - Array of products or product - items
+//  Selection      - String                  - Selection ID              - sel
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function AddProductToSelection(Val Array of products, Val Selection, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetCollection(Array of products);
+    OPI_TypeConversion.GetLine(Selection);
+    
+    Parameters_     = GetStandardParameters(Parameters);
+    Array_of_Products = New Array;
+      
+    For Each Product In Array of products Do
+        Array_of_Products.Add(OPI_Tools.NumberToString(Product));    
+    EndDo;    
+    
+    ProductList = StrJoin(Array_of_Products, ",");
+    
+    Parameters_.Insert("item_ids" , ProductList);
+    Parameters_.Insert("album_ids", Selection);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.addToAlbum", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Remove product from selection
+// Removes a previously added product from the selection
+// 
+// Parameters:
+//  Product     - String - Product ID   - item
+//  Selection  - String - Selection ID - sel
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function RemoveProductFromSelection(Val Product, Val Selection, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Product);
+    OPI_TypeConversion.GetLine(Selection);
+
+    Parameters_   = GetStandardParameters(Parameters);
+    
+    Parameters_.Insert("item_id"  , Product);
+    Parameters_.Insert("album_ids", Selection);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.removeFromAlbum", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// DeleteSelection
+// Deletes the selection by ID
+//
+// Parameters:
+//  Selection  - String              - Selection ID - sel
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK
+Function DeleteSelection(Val Selection, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Selection);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("album_id", Selection);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.deleteAlbum", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region ProductPropertiesManagement
+
+// Get property list
+// Gets the list of properties of group products
+// 
+// Parameters:
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK 
+Function GetPropertyList(Val Parameters = "") Export
+    
+    Response   = "response";
+    Parameters_ = GetStandardParameters(Parameters);
+    
+    Response      = OPI_Tools.Get("api.vk.com/method/market.getProperties", Parameters_);
+    Properties   = Response[Response]["items"];
+    
+    Return Properties;
+    
+EndFunction
+
+// Create product property
+// Creates a new property for use in products
+// 
+// Parameters:
+//  Name  - String              - Property name               - title
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK 
+Function CreateProductProperty(Val Name, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Name);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("title", Name);
+        
+    Response = OPI_Tools.Get("api.vk.com/method/market.addProperty", Parameters_);   
+    
+    Return Response;
+
+EndFunction
+
+// Edit product property
+// Edits the existing product property
+// 
+// Parameters:
+//  Name  - String              - New name                  - title
+//  Property  - String, Number        - Property ID                     - prop
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK 
+Function EditProductProperty(Val Name, Val Property, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Name);
+    OPI_TypeConversion.GetLine(Property);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("title"      , Name);
+    Parameters_.Insert("property_id", Property);
+    Parameters_.Insert("type"       , "text");
+        
+    Response = OPI_Tools.Get("api.vk.com/method/market.editProperty", Parameters_);   
+    
+    Return Response;
+
+EndFunction
+
+// Delete product property
+// Deletes the existing product property
+// 
+// Parameters:
+//  Property  - String, Number        - Property ID                     - prop
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK 
+Function DeleteProductProperty(Val Property, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Property);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("property_id", Property);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.deleteProperty", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Add product property variant
+// Adds a variant for an existing property
+// 
+// Parameters:
+//  Value  - String              - Property value                      - value
+//  Property  - String, Number        - Property ID where the variant is added  - prop
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK    
+Function AddProductPropertyVariant(Val Value, Val Property, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Property);
+    OPI_TypeConversion.GetLine(Value);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("property_id", Property);
+    Parameters_.Insert("title"      , Value);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.addPropertyVariant", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Edit product property variant
+// Edits the value of an existing product property variant
+// 
+// Parameters:
+//  Value  - String              - New property value         - value
+//  Property  - String, Number        - Property ID                     - prop
+//  Option   - String, Number        - Variant ID                     - option
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK      
+Function EditProductPropertyVariant(Val Value, Val Property, Val Option, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Value);
+    OPI_TypeConversion.GetLine(Property);
+    OPI_TypeConversion.GetLine(Option);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("property_id", Property);
+    Parameters_.Insert("variant_id" , Option);
+    Parameters_.Insert("title"      , Value);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.editPropertyVariant", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+// Delete product property variant
+// Deletes the previously created product property variant
+// 
+// Parameters:
+//  Option   - String, Number        - Variant ID - option
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK     
+Function DeleteProductPropertyVariant(Val Option, Val Parameters = "") Export
+    
+    OPI_TypeConversion.GetLine(Option);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("variant_id", Option);
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market.deletePropertyVariant", Parameters_);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region OrderManagement
+
+// Get order list
+// Returns the community's order list
+// 
+// Parameters:
+//  Parameters - Structure Of String - See GetStandardParameters - auth - Authorization JSON or path to .json
+// 
+// Return value:
+//  Key-Value Pair - Serialized JSON response from VK 
+Function GetOrderList(Val Parameters = "") Export
+    
+    Parameters = GetStandardParameters(Parameters);
+    Parameters.Insert("count", 50);
+    
+    ArrayOfOrders = New Array;
+    GetOrderListRecursively(ArrayOfOrders, Parameters);
+    
+    Return ArrayOfOrders;
+    
+EndFunction
+
+#EndRegion
+
+#Region Others
+
+// Create keyboard
+// Forms a keyboard from an array of buttons
+// 
+// Parameters:
+//  ButtonArray - Array of Strings - Array of button titles - buttons
+// 
+// Return value:
+//  String -  Keyboard JSON
+Function FormKeyboard(Val ButtonArray) Export
+      
+    OPI_TypeConversion.GetCollection(ButtonArray);  
+    
+    Keyboard          = New Structure;
+    KeyboardArray    = New Array;
+    ArrayBlock         = New Array;
+    
+    For Each Action In ButtonArray Do
+        
+        Button      = New Structure;
+        Expression   = New Structure;                        
+        
+        Expression.Insert("type" , "text");
+        Expression.Insert("label", Action);
+        
+        Button.Insert("action", Expression);
+        ArrayBlock.Add(Button);
+        
+    EndDo;
+    
+    KeyboardArray.Add(ArrayBlock);
+    
+    Keyboard.Insert("buttons" , KeyboardArray);   
+    Keyboard.Insert("one_time", False);
+    
+    Return OPI_Tools.JSONString(Keyboard);
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function GetStandardParameters(Val Parameters = "")
+    
+    // Here is a collection of data definitions for working with the VK API
+    // You can override them by passing them as a parameter
+    // Matching fields will be overwritten with the parameter of the function
+    
+    Parameters_ = New Structure;
+    
+    // access_token - можно получить in браузере по URL from фунtoции CreateTokenRetrievalLink()
+    // from_group   - actions will be performed on behalf of the group
+    // owner_id     - group ID with "-" at the beginning. Can be found in the settings of the VK group or in its URL if not set
+    //               set your
+    // app_id       - application ID that needs to be created in the profile on the developer page
+    // group_id     - owner_id, но without "-"
+    
+    Parameters_.Insert("access_token"  , "");
+    Parameters_.Insert("from_group"    , "1");
+    Parameters_.Insert("owner_id"      , "");
+    Parameters_.Insert("v"             , "5.131");
+    Parameters_.Insert("app_id"        , "");
+    Parameters_.Insert("group_id"      , "");
+    
+    OPI_TypeConversion.GetCollection(Parameters);
+    
+    If TypeValue(Parameters) = Type("Structure") Or TypeValue(Parameters) = Type("Match") Then
+        For Each PassedParameter In Parameters Do
+            Parameters_.Insert(PassedParameter.Key, OPI_Tools.NumberToString(PassedParameter.Value));
+        EndDo;
+    EndIf;
+
+    Return Parameters_;
+
+EndFunction
+
+Function GetImageID(Val Image, Val Parameters, Val View)
+	
+	Response  = "response";
+    Response     = UploadPhotoToServer(Image, Parameters, View);
+    Result = Response[Response];
+
+    If ValueFilled(Result) Then
+    	PhotoID = Result["photo_id"];
+    	
+    	If Not ValueFilled(PhotoID) Then
+    		Return Response;	
+    	EndIf;
+    	
+    Else
+    	Return Response;
+    EndIf;
+    
+    PhotoID = OPI_Tools.NumberToString(PhotoID);
+    Return PhotoID;
+    
+EndFunction
+
+Function GetImageCorrespondence(Val Image, Val Parameters, Val View)
+	
+	Response       = UploadPhotoToServer(Image, Parameters, View);   
+    ResponseArray = Response.Get("response");
+    
+    If Not ValueFilled(ResponseArray) Or Not TypeValue(ResponseArray) = Type("Array") Then
+    	Return Response;
+    Else
+    	If ResponseArray.Quantity() = 0 Then
+    		Return Response;
+    	Else
+    		ResponseCorrespondence = ResponseArray[0];
+    	EndIf;
+    EndIf;
+     
+    Return ResponseCorrespondence;
+       
+EndFunction
+
+Function GetSelectionArray(Val Selections, Val Parameters = "")
+	
+	Response   = "response";
+	Selections   = GetSelectionsByID(Selections, Parameters);
+    Result  = Selections[Response];
+    
+    If ValueFilled(Result) Then
+    	
+    	SelectionArray = Result["items"];
+    	
+    	If Not ValueFilled(SelectionArray) Then
+    		Return Selections;	
+    	EndIf;
+    	
+	Else
+		Return Selections;
+    EndIf;
+    
+    Return SelectionArray;
+            
+EndFunction
+
+Function DetermineImageUploadMethod(Val View)
+    
+    MethodCorrespondence = New Match;
+    Upload            = "Upload";
+    Save          = "Save";
+    Method              = "Method";
+    Photo                = "Photo";
+    
+    If View = "Post" Then
+       
+        MethodCorrespondence.Insert(Upload  , "photos.getWallUploadServer");
+        MethodCorrespondence.Insert(Save, "photos.saveWallPhoto");
+        MethodCorrespondence.Insert(Photo      , "photo");
+        MethodCorrespondence.Insert(Method    , 1);
+        
+    ElsIf View = "Product" Then
+        
+        MethodCorrespondence.Insert(Upload  , "market.getProductPhotoUploadServer");
+        MethodCorrespondence.Insert(Save, "market.saveProductPhoto");
+        MethodCorrespondence.Insert(Method    , 2);
+        
+    ElsIf View = "Story" Then
+        
+        MethodCorrespondence.Insert(Upload  , "stories.getPhotoUploadServer");
+        MethodCorrespondence.Insert(Save, "stories.save");
+        MethodCorrespondence.Insert(Method    , 3);
+    
+    ElsIf View = "Poll" Then
+        
+        MethodCorrespondence.Insert(Upload  , "polls.getPhotoUploadServer");
+        MethodCorrespondence.Insert(Save, "polls.savePhoto");
+        MethodCorrespondence.Insert(Photo      , "photo");
+        MethodCorrespondence.Insert(Method    , 1);
+        
+    Else
+        
+        MethodCorrespondence.Insert(Upload  , "photos.getUploadServer");
+        MethodCorrespondence.Insert(Save, "photos.save");
+        MethodCorrespondence.Insert(Photo      , "photos_list");
+        MethodCorrespondence.Insert(Method    , 1);
+        
+    EndIf;
+    
+    Return MethodCorrespondence;
+    
+EndFunction
+
+Function GetProductParameterMapping()
+    
+    Fields = New Match();
+    Fields.Insert("Name"                , "name");     
+    Fields.Insert("Description"           , "description"); 
+    Fields.Insert("Category"          , "category_id");                 
+    Fields.Insert("Price"               , "price");                 
+    Fields.Insert("OldPrice"         , "old_price");  
+    Fields.Insert("URL"                , "url");
+    Fields.Insert("MainInGroup"     , "is_main_variant"); 
+    Fields.Insert("Width"             , "dimension_width");      
+    Fields.Insert("Height"             , "dimension_height");      
+    Fields.Insert("Depth"            , "dimension_length");      
+    Fields.Insert("Weight"                , "weight");      
+    Fields.Insert("SKU"                , "sku"); 
+    Fields.Insert("AvailableBalance"   , "stock_amount");
+       
+    Return Fields;
+
+EndFunction
+
+Function ProductManagement(Val ProductDescription, Val ProductID = "", Val Selection = "", Val Parameters = "")
+    
+    OPI_TypeConversion.GetLine(ProductID);
+    OPI_TypeConversion.GetLine(Selection);
+    OPI_TypeConversion.GetCollection(ProductDescription);
+    
+    Parameters_ = GetStandardParameters(Parameters);
+    Parameters_.Insert("v", "5.199");
+    
+    Response = "response";
+    
+    FillProductRequestFields(ProductDescription, Parameters_);
+    
+    If ValueFilled(ProductID) Then       
+        Parameters_.Insert("item_id", ProductID);
+        Method = "edit";    
+    Else       
+        Method = "add";
+    EndIf;
+       
+    Response     = OPI_Tools.Get("api.vk.com/method/market." + Method, Parameters_);
+    Result = Response[Response];
+    
+    If Not ValueFilled(ProductID) And ValueFilled(Result) Then 
+    	
+        ProductID = Result["market_item_id"];
+        
+        If Not ValueFilled(ProductID) Then
+        	Return Response;	
+        EndIf;
+        
+    Else
+    	Return Response;
+    EndIf;
+    
+    If ValueFilled(Selection) And ValueFilled(ProductID) Then
+        AddProductToSelection(ProductID, Selection, Parameters_);
+    EndIf;
+    
+    Return Response;
+
+EndFunction
+
+Function SelectionManagement(Val Name
+    , Val Image   = ""
+    , Val SelectionID = ""
+    , Val Main   = False
+    , Val Hidden    = False
+    , Val Parameters  = "")
+    
+    OPI_TypeConversion.GetLine(Name);
+    OPI_TypeConversion.GetLine(SelectionID);
+    OPI_TypeConversion.GetBoolean(Main);
+    OPI_TypeConversion.GetBoolean(Hidden);
+    
+    Parameters_ = GetStandardParameters(Parameters);   
+    Response      = AddImageParameter(Image, SelectionID, Parameters_);
+    
+    If ValueFilled(Response) Then
+        Return Response;
+    EndIf;
+      
+    Parameters_.Insert("title"        , Name);
+    Parameters_.Insert("main_album"   , ?(Main, 1, 0));
+    Parameters_.Insert("is_hidden"    , ?(Hidden, 1, 0));
+    
+    If ValueFilled(SelectionID) Then       
+        Parameters_.Insert("album_id", SelectionID);
+        Method = "editAlbum";    
+    Else       
+        Method = "addAlbum";
+    EndIf;
+    
+    Response = OPI_Tools.Get("api.vk.com/method/market." + Method, Parameters_);
+    
+    Return Response;
+
+EndFunction
+
+Function AddImageParameter(Val Image, Val SelectionID, Parameters)
+    
+    PhotoID = "photo_id";
+    
+    If ValueFilled(Image) Then
+        
+        PhotoID = GetImageID(Image, Parameters, "Product");
+        
+        If Not TypeValue(PhotoID) = Type("String") Then
+            Return PhotoID; 
+        EndIf;
+      
+        Parameters.Insert(PhotoID, PhotoID);
+        
+    Else
+        
+        If ValueFilled(SelectionID) Then
+            
+            Selections = GetSelectionArray(SelectionID, Parameters);
+            
+            If Not TypeValue(Selections) = Type("Array") Then
+                Return Selections;   
+            EndIf;
+                                
+            If Not Selections.Quantity() = 0 Then              
+                PhotoID = Selections[0]["photo"]["id"];
+                OPI_TypeConversion.GetLine(PhotoID);
+                Parameters.Insert(PhotoID, PhotoID);
+            EndIf;
+            
+        EndIf;
+        
+    EndIf;
+    
+    Return "";
+    
+EndFunction
+
+Procedure FillPhotoUploadParameters(Val Method, Val Response, Parameters)
+    
+    Response            = "response";
+    Method              = Method["Method"];
+    StandardMethod   = 1;
+    NewMethod         = 2;
+
+    If Method = StandardMethod Then
+        
+        Hash       = "hash";
+        Serv       = "server";
+        Aid        = "aid";
+        Photo       = Method["Photo"];
+        
+        Parameters.Insert(Hash, Response[Hash]);
+        Parameters.Insert(Photo, Response[Photo]);
+        
+        PhotoServer = Response.Get(Serv);
+               
+        If ValueFilled(PhotoServer) Then
+            PhotoServer = OPI_Tools.NumberToString(PhotoServer);
+            Parameters.Insert(Serv, PhotoServer);      
+        EndIf;
+        
+        Identifier = Response.Get(Aid);
+               
+        If ValueFilled(Identifier) Then
+            Identifier = OPI_Tools.NumberToString(Identifier);
+            Parameters.Insert(Aid , Identifier);      
+        EndIf;
+        
+    ElsIf Method = NewMethod Then
+        
+        ResponseString = OPI_Tools.JSONString(Response);
+        Parameters.Insert("upload_response", ResponseString);
+        
+    Else
+        
+        Parameters.Insert("upload_results", Response[Response]["upload_result"]);
+        
+    EndIf;
+
+EndProcedure
+
+Procedure FillProductRequestFields(Val ProductDescription, Parameters)
+    
+    Response     = "response";
+    MainPhoto = ProductDescription["MainPhoto"];
+    AdditionalPhoto      = ProductDescription["AdditionalPhotos"];
+    Properties     = ProductDescription["PropertyValues"];
+    
+    If ValueFilled(MainPhoto) Then
+    	
+        Response     = UploadPhotoToServer(MainPhoto, Parameters, "Product");
+        Result = Response[Response];
+        
+        If ValueFilled(Result) Then
+        	PhotoID = Result["photo_id"];
+        	
+        	If Not ValueFilled(PhotoID) Then
+        		Return;	
+        	EndIf;
+        	
+        Else
+        	Return;
+        EndIf;
+        
+        PhotoID = OPI_Tools.NumberToString(PhotoID);
+        Parameters.Insert("main_photo_id", PhotoID); 
+         
+    EndIf;
+    
+    If TypeValue(Properties) = Type("Array") Then  
+        
+        Properties_ = New Array;
+        
+        For Each Property In Properties Do
+            Properties_.Add(OPI_Tools.NumberToString(Property));   
+        EndDo;
+        
+        Properties = StrJoin(Properties_, ","); 
+        
+    EndIf;
+    
+    If ValueFilled(Properties) Then
+        Parameters.Insert("variant_ids", OPI_Tools.NumberToString(Properties));    
+    EndIf;
+    
+    AddAdditionalProductPhotos(AdditionalPhoto, Parameters);
+    
+    For Each Field In GetProductParameterMapping() Do
+        
+        Value = ProductDescription[Field.Key];
+        
+        If Value <> Undefined Then
+            Parameters.Insert(Field.Value, ProductDescription[Field.Key]);
+        EndIf;
+        
+    EndDo;
+
+EndProcedure
+
+Procedure AddAdditionalProductPhotos(Val PhotoArray, Parameters)
+    
+    If TypeValue(PhotoArray) = Type("Array") Then
+        If PhotoArray.Quantity() > 0 Then
+            
+            PhotoString = "";
+            
+            For Each Photo In PhotoArray Do
+                
+                PhotoID = GetImageID(Photo, Parameters, "Product");
+                
+		        If Not TypeValue(PhotoID) = Type("String") Then
+		    		Return;	
+		    	EndIf;
+
+                PhotoString = PhotoString + PhotoID + ","; 
+                
+            EndDo;
+            
+            PhotoString = Left(PhotoString, StrLength(PhotoString) - 1);
+            Parameters.Insert("photo_ids", PhotoString);
+        EndIf;
+    EndIf;
+    
+EndProcedure
+
+Procedure GetProductListRecursively(Array of products, Parameters, Shift = 0)
+    
+    Response         = "response";
+    MaxInRequest = 200;
+    Response            = OPI_Tools.Get("api.vk.com/method/market.get", Parameters);
+    Products           = Response[Response]["items"];
+    
+    If Products.Quantity() = 0 Then
+        Return;
+    EndIf;      
+    
+    For Each Product In Products Do
+        Array of products.Add(Product);
+    EndDo;
+       
+    Shift = Shift + MaxInRequest;
+    Parameters.Insert("offset", Shift);
+    GetProductListRecursively(Array of products, Parameters, Shift);
+    
+EndProcedure
+
+Procedure GetAlbumListRecursively(ArrayOfAlbums, Parameters, Shift = 0)
+    
+    Response         = "response";
+    MaxInRequest = 100;
+    Response            = OPI_Tools.Get("api.vk.com/method/market.getAlbums", Parameters);
+    Albums          = Response[Response]["items"];
+    
+    If Albums.Quantity() = 0 Then
+        Return;
+    EndIf;      
+    
+    For Each Album In Albums Do
+        ArrayOfAlbums.Add(Album);
+    EndDo;
+       
+    Shift = Shift + MaxInRequest;
+    Parameters.Insert("offset", Shift);
+    GetAlbumListRecursively(ArrayOfAlbums, Parameters, Shift);
+    
+EndProcedure
+
+Procedure GetOrderListRecursively(ArrayOfOrders, Parameters, Shift = 0)
+    
+    Response         = "response";
+    MaxInRequest = 50;
+    Response            = OPI_Tools.Get("api.vk.com/method/market.getGroupOrders", Parameters);
+    Orders           = Response[Response]["items"];
+    
+    If Orders.Quantity() = 0 Then
+        Return;
+    EndIf;      
+    
+    For Each Order In Orders Do
+        ArrayOfOrders.Add(Order);
+    EndDo;
+       
+    Shift = Shift + MaxInRequest;
+    Parameters.Insert("offset", Shift);
+    GetOrderListRecursively(ArrayOfOrders, Parameters, Shift);
+    
+EndProcedure
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo b/service/interim/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
new file mode 100644
index 0000000000..c7eca11ad8
--- /dev/null
+++ b/service/interim/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>Methodы интеграции with VK (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Viber/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Viber/Module.bsl
new file mode 100644
index 0000000000..2bcd2a9418
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Viber/Module.bsl
@@ -0,0 +1,414 @@
+// Location OS: ./OInt/core/Modules/OPI_Viber.os
+// Library: Viber
+// CLI Command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+#Region SettingsAndInformation
+
+// Set Webhook
+// InАЖNО: Уwithтаноintoа Webhook обязательto по праinилам Viber. For thisго todо иметь withinобоdный URL,
+// which will return 200 and a genuine SSL certificate. If there is a certificate and the database is published
+// on the server - you can use an HTTP service. Information about new messages will also be sent there
+// Viber periodically knocks on the Webhook address, so if it is inactive, everything will stop working
+// 
+// Parameters:
+//  Token - String - Viber Token               - token
+//  URL   - String - URL for setting up Webhook - url
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function SetWebhook(Val Token, Val URL) Export
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("url"         , URL  , "String", Parameters);
+    OPI_Tools.AddField("auth_token"  , Token, "String", Parameters);
+ 
+    Return OPI_Tools.Post("https://chatapi.viber.com/pa/set_webhook", Parameters);
+    
+EndFunction
+
+// Get channel information
+// Here you can get the channel's user IDs. Bot IDs need to be obtained from the Webhook arrivals
+// The user ID from channel information is not suitable for sending messages through the bot - they are different
+// 
+// Parameters:
+//  Token - String - Token - token
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function GetChannelInformation(Val Token) Export
+    
+    URL = "https://chatapi.viber.com/pa/get_account_info";   
+    Return OPI_Tools.Get(URL, , TokenInHeaders(Token));
+    
+EndFunction
+
+// Get user data
+// Gets user information by ID
+// 
+// Parameters:
+//  Token          - String        - Token                 - token
+//  UserID - String, Number - Viber User ID - user
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function GetUserData(Val Token, Val UserID) Export
+    
+    URL = "https://chatapi.viber.com/pa/get_user_details";
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("id", UserID, "String", Parameters);
+    
+    Response = OPI_Tools.Post(URL, Parameters, TokenInHeaders(Token));
+
+    Return Response;
+
+EndFunction
+
+// Get online users
+// Gets the status of a user or several users by ID
+// 
+// Parameters:
+//  Token           - String                              - Viber Token                - token
+//  UserIDs - String,Number,Array of String,Number - Viber User(s) ID  - users
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function GetOnlineUsers(Val Token, Val UserIDs) Export
+    
+    URL = "https://chatapi.viber.com/pa/get_online";
+        
+    Parameters = New Structure;
+    OPI_Tools.AddField("ids", UserIDs, "Collection", Parameters);
+    
+    Response = OPI_Tools.Post(URL, Parameters, TokenInHeaders(Token));
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region MessageSending
+
+// Send text message
+// Sends a text message to a chat or channel
+// 
+// Parameters:
+//  Token          - String       - Token                                                               - token
+//  Text          - String       - Message text                                                     - text
+//  UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user
+//  SendingToChannel - Boolean       - Sending to channel or bot chat                                     - ischannel
+//  Keyboard     - Structure Of String -  See CreateKeyboardFromArrayButton - keyboard
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function SendTextMessage(Val Token
+    , Val Text
+    , Val UserID
+    , Val SendingToChannel
+    , Val Keyboard = "") Export
+    
+    Return SendMessage(Token, "text", UserID, SendingToChannel, , Text, Keyboard); 
+    
+EndFunction
+
+// Send image
+// Sends an image to a chat or channel
+// 
+// Parameters:
+//  Token          - String       - Token                                                                - token
+//  URL            - String       - Image URL                                                         - picture
+//  UserID - String, Number - User ID. For channel > administrator, for bot > recipient  - user
+//  SendingToChannel - boolean       - Sending to channel or bot chat                                      - ischannel
+//  Description       - String       - Image annotation                                                 - description
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function SendImage(Val Token, Val URL, Val UserID, Val SendingToChannel, Val Description = "") Export
+    
+    Return SendMessage(Token, "picture", UserID, SendingToChannel, URL, Description);
+    
+EndFunction
+
+// SendFile
+// Sends a file (document) to a chat or channel
+// 
+// Parameters:
+//  Token          - String       - Token                                                                - token
+//  URL            - String       - File URL                                                            - file 
+//  UserID - String, Number - User ID. For channel > administrator, for bot > recipient  - user   
+//  SendingToChannel - Boolean       - Sending to channel or bot chat                                      - ischannel
+//  Extension     - String       - File extension                                                     - ext
+//  Size         - Number        - File size. If not filled in > determined automatically by downloading the file - size
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function SendFile(Val Token
+    , Val URL
+    , Val UserID
+    , Val SendingToChannel
+    , Val Extension
+    , Val Size = "") Export
+        
+    If Not ValueFilled(Size) Then
+        
+        Response  = OPI_Tools.Get(URL);
+        Size = Response.Size();
+        
+    EndIf;
+    
+    String_    = "String";
+    Extension = StringReplace(Extension, ".", "");
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("URL"       , URL       , String_, Parameters);
+    OPI_Tools.AddField("Size"    , Size    , String_, Parameters);
+    OPI_Tools.AddField("Extension", Extension, String_, Parameters);
+    
+    Return SendMessage(Token, "file", UserID, SendingToChannel, Parameters);
+    
+EndFunction
+
+// Send contact
+// Sends a contact with a phone number to a chat or channel
+// 
+// Parameters:
+//  Token          - String       - Token                                                                - token
+//  ContactName    - String       - Contact name                                                         - name
+//  PhoneNumber  - String       - Phone number                                                       - phone
+//  UserID - String, Number - User ID. For channel > administrator, for bot > recipient  - user  
+//  SendingToChannel - Boolean       - Sending to channel or bot chat                                      - ischannel
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function SendContact(Val Token
+    , Val ContactName
+    , Val PhoneNumber
+    , Val UserID
+    , Val SendingToChannel) Export
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("name"        , ContactName  , "String", Parameters);
+    OPI_Tools.AddField("phone_number", PhoneNumber, "String", Parameters);
+    
+    Return SendMessage(Token, "contact", UserID, SendingToChannel, Parameters); 
+    
+EndFunction
+
+// SendLocation
+// Sends geographic coordinates to a chat or channel
+// 
+// Parameters:
+//  Token          - String       - Token                                                                - token
+//  Latitude         - String, Number - Geographic latitude                                                - lat
+//  Longitude        - String, Number - Geographic longitude                                               - long
+//  UserID - String, Number - User ID. For channel > administrator, for bot > recipient  - user  
+//  SendingToChannel - Boolean       - Sending to channel or bot chat                                      - ischannel
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function SendLocation(Val Token, Val Latitude, Val Longitude, Val UserID, Val SendingToChannel) Export
+    
+    Parameters = New Structure;
+    OPI_Tools.AddField("lat", Latitude , "String", Parameters);
+    OPI_Tools.AddField("lon", Longitude, "String", Parameters);
+    
+    Return SendMessage(Token, "location", UserID, SendingToChannel, Parameters);
+    
+EndFunction
+
+// SendLink
+// Sends a URL with a preview to a chat or channel
+// 
+// Parameters:
+//  Token          - String       - Token                                                                - token
+//  URL            - String       - SentLink                                                  - url
+//  UserID - String, Number - User ID. For channel > administrator, for bot > recipient  - user  
+//  SendingToChannel - Boolean       - Sending to channel or bot chat                                      - ischannel
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Viber
+Function SendLink(Val Token, Val URL, Val UserID, Val SendingToChannel) Export
+    
+    Return SendMessage(Token, "url", UserID, SendingToChannel, URL);
+    
+EndFunction
+
+// Create a keyboard from an array of buttons
+// Returns a keyboard structure for messages
+// 
+// Parameters:
+//  ButtonArray - Array of Strings - Array of buttons                - buttons
+//  ButtonColor   - String           - HEX color of buttons with # at the beginning - color
+// 
+// Return value:
+//  Structure -  Create a keyboard from an array of buttons:
+// * Buttons - Array of Structure - Array of formed buttons 
+// * Type - String - KeyboardType 
+Function CreateKeyboardFromArrayButton(Val ButtonArray, Val ButtonColor = "#2db9b9") Export
+    
+    OPI_TypeConversion.GetLine(ButtonColor);
+    OPI_TypeConversion.GetCollection(ButtonArray);
+    
+    ArrayOfButtonStructures = New Array;
+    KeyboardStructure  = New Structure;
+    
+    For Each ButtonText In ButtonArray Do
+        
+        ButtonStructure = New Structure;
+        ButtonStructure.Insert("ActionType", "reply");
+        ButtonStructure.Insert("ActionBody", ButtonText);
+        ButtonStructure.Insert("Text"      , ButtonText);
+        ButtonStructure.Insert("BgColor"   , ButtonColor);
+        ButtonStructure.Insert("Coloumns"  , 3);
+    
+        ArrayOfButtonStructures.Add(ButtonStructure);
+        
+    EndDo;
+    
+    KeyboardStructure.Insert("Buttons", ArrayOfButtonStructures);
+    KeyboardStructure.Insert("Type"   , "keyboard");
+    
+    Return KeyboardStructure;
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+// Send message.
+// 
+// Parameters:
+//  Token - String - Token
+//  Type - String -  TypeOfSentMessage
+//  UserID - String, Number - Viber User ID
+//  IsChannel - Boolean - Sending to channel or bot chat
+//  Value - String, Structure -  Value:
+// * URL - String - When sending URL
+// * Size - Number, String - File size in case of sending
+// * Extension - String - File extension in case of sending
+//  Text - String -  Message text
+//  Keyboard - Structure Of String -  Keyboard, if needed, see CreateKeyboardFromArrayButton 
+// 
+// Return value:
+//  Arbitrary, HTTP Response -  Send message
+Function SendMessage(Val Token
+    , Val Type
+    , Val UserID
+    , Val IsChannel
+    , Val Value = ""
+    , Val Text = ""
+    , Val Keyboard = "")
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Type);
+    OPI_TypeConversion.GetLine(UserID);
+    OPI_TypeConversion.GetLine(Text);
+    OPI_TypeConversion.GetBoolean(IsChannel);
+    OPI_TypeConversion.GetCollection(Keyboard);
+    
+    ParametersStructure = ReturnStandardParameters();
+    ParametersStructure.Insert("type", Type);  
+    
+    If (Type = "text" Or Type = "picture") And ValueFilled(Text) Then
+        ParametersStructure.Insert("text", Text);
+    EndIf;
+    
+    If TypeValue(Keyboard) = Type("Structure") Then
+        ParametersStructure.Insert("keyboard", Keyboard);
+    EndIf;
+    
+    If ValueFilled(Value) Then
+        
+        If Type = "file" Then
+            ParametersStructure.Insert("media"    , Value["URL"]);
+            ParametersStructure.Insert("size"     , Value["Size"]);
+            ParametersStructure.Insert("file_name", "File." + Value["Extension"]);
+        ElsIf Type = "contact" Then
+            ParametersStructure.Insert("contact"  , Value);
+        ElsIf Type = "location" Then
+            ParametersStructure.Insert("location" , Value);
+        Else
+            ParametersStructure.Insert("media"    , Value);
+        EndIf;
+        
+    EndIf;
+    
+    If IsChannel Then
+        ParametersStructure.Insert("from", UserID);
+        URL = "https://chatapi.viber.com/pa/post";
+    Else   
+        ParametersStructure.Insert("receiver", UserID);
+        URL = "https://chatapi.viber.com/pa/send_message";
+    EndIf;
+    
+    Response = OPI_Tools.Post(URL, ParametersStructure, TokenInHeaders(Token));
+    
+    Try
+        Return OPI_Tools.JsonToStructure(Response.GetBodyAsBinaryData());
+    Except
+        Return Response;
+    EndTry;
+    
+EndFunction
+
+Function ReturnStandardParameters() 
+    
+    SenderStructure = New Structure;
+    SenderStructure.Insert("name"  , "Bot");
+    SenderStructure.Insert("avatar", "");
+    
+    ParametersStructure  = New Structure;
+    ParametersStructure.Insert("sender", SenderStructure);
+    ParametersStructure.Insert("min_api_version", 1);
+    
+    Return ParametersStructure;
+    
+EndFunction
+
+Function TokenInHeaders(Val Token)
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    HeadersStructure = New Match;
+    HeadersStructure.Insert("X-Viber-Auth-Token", Token);
+    Return HeadersStructure;
+    
+EndFunction
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
new file mode 100644
index 0000000000..ec0d881730
--- /dev/null
+++ b/service/interim/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>Methodы интеграции with Viber (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
new file mode 100644
index 0000000000..a22b6dc525
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
@@ -0,0 +1,635 @@
+// OS Location: ./OInt/core/Modules/OPI_YandexDisk.os
+// Library: Yandex Disk
+// CLI command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools" 
+
+#Region ProgrammingInterface
+
+#Region FileAndFolderManagement
+
+// Get disk information
+// Gets information about the current disk
+// 
+// Parameters:
+//  Token - String - Token - token
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function GetDiskInformation(Val Token) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    Headers = AuthorizationHeader(Token);
+    Response     = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk", , Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Create folder
+// Creates a directory on the disk
+// 
+// Parameters:
+//  Token - String - Token                     - token
+//  Path  - String - Path to the created folder   - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function CreateFolder(Val Token, Val Path) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Path);
+    
+    Headers = AuthorizationHeader(Token);
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources";
+    Href      = "href";
+    
+    Parameters = New Structure;
+    Parameters.Insert("path", Path);
+    
+    Parameters = OPI_Tools.RequestParametersToString(Parameters);    
+    Response     = OPI_Tools.Put(URL + Parameters, , Headers, False);
+    
+    ResponseURL = Response[Href];  
+    
+    If Not ValueFilled(ResponseURL) Then
+    	Return Response;	
+    EndIf;
+     
+    Response = OPI_Tools.Get(ResponseURL, , Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Get object
+// Gets information about a disk object at the specified path
+// 
+// Parameters:
+//  Token - String - Token                  - token
+//  Path  - String - Path to folder or file - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function GetObject(Val Token, Val Path) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Path);
+    
+    Headers = AuthorizationHeader(Token);
+    Parameters = New Structure;
+    Parameters.Insert("path", Path);
+    
+    Response     = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources", Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Delete object
+// Deletes an object at the specified path
+// 
+// Parameters:
+//  Token    - String - Token                              - token
+//  Path     - String - Path to the folder or file to be deleted   - path
+//  ToCart - Boolean - To cart                          - can
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function DeleteObject(Val Token, Val Path, Val ToCart = True) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Path);
+    OPI_TypeConversion.GetBoolean(ToCart);
+    
+    Headers = AuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    Parameters.Insert("path"       , Path);
+    Parameters.Insert("permanently", Not ToCart);
+    
+    Response     = OPI_Tools.Delete("https://cloud-api.yandex.net/v1/disk/resources", Parameters, Headers);
+    
+    Return Response;
+
+EndFunction
+
+// Create object copy
+// Creates a copy of the object at the specified path and path to the original
+// 
+// Parameters:
+//  Token          - String - Token                                                   - token
+//  Original       - String - Path to the original file or directory                 - from
+//  Path           - String - Destination path for the copy                               - to
+//  Overwrite - Boolean - Overwrite if a file with the same name already exists  - rewrite
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function CreateObjectCopy(Val Token, Val Original, Val Path, Val Overwrite = False) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Original);
+    OPI_TypeConversion.GetLine(Path);
+    OPI_TypeConversion.GetBoolean(Overwrite);
+    
+    Headers = AuthorizationHeader(Token);
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources/copy";
+    Href      = "href";
+    
+    Parameters = New Structure;
+    Parameters.Insert("from"       , Original);
+    Parameters.Insert("path"       , Path);
+    Parameters.Insert("overwrite"  , Overwrite);
+    
+    Parameters = OPI_Tools.RequestParametersToString(Parameters); 
+    Response     = OPI_Tools.Post(URL + Parameters, , Headers, False);
+    
+    ResponseURL = Response[Href]; 
+    
+    If Not ValueFilled(ResponseURL) Then
+	    Return Response;	
+    EndIf;
+           
+    Response = OPI_Tools.Get(ResponseURL, , Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get download link
+// Gets a download link for the file
+// 
+// Parameters:
+//  Token - String - Token                         - token
+//  Path  - String  - Path to the file for downloading  - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function GetDownloadLink(Val Token, Val Path) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Path);
+    
+    Headers = AuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    Parameters.Insert("path", Path);
+    
+    Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Parameters, Headers);
+    
+    Return Response;
+     
+EndFunction
+
+// Download file
+// Downloads a file at the specified path
+// 
+// Parameters:
+//  Token          - String - Token                        - token
+//  Path           - String - Path to the file for downloading  - path
+//  SavePath - String - File save path        - out 
+// 
+// Return value:
+//  BinaryData,String - Binary data or file path when SavePath parameter is specified
+Function DownloadFile(Val Token, Val Path, Val SavePath = "") Export
+	
+    OPI_TypeConversion.GetLine(SavePath);
+	Response  = GetDownloadLink(Token, Path);
+	URL    = Response["href"];
+	
+	If Not ValueFilled(URL) Then
+		Return Response;
+	EndIf;
+	
+	Response = OPI_Tools.Get(URL, , , SavePath);
+    
+    Return Response;
+    
+EndFunction
+
+// Get list of files
+// Gets a list of files with or without filtering by type
+// List available typeоin: audio, backup, book, compressed, data, development, 
+//                         diskimage, document, encoded, executable, flash, font, 
+//                         mage, settings, spreadsheet, text, unknown, video, web
+//                                  
+// Parameters:
+//  Token             - String       - Token                                                - token
+//  Quantity        - Number, String - Number of returned objects                     - amount
+//  OffsetFromStart  - Number        - Offset for getting objects not from the beginning of the list  - offset
+//  FilterByType       - String       - Filter by file type                                  - type
+//  SortByDate - Boolean       - True > sort by date, False > alphabetically     - datesort
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function GetFilesList(Val Token
+    , Val Quantity = 0
+    , Val OffsetFromStart = 0
+    , Val FilterByType = ""
+    , Val SortByDate = False) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Quantity);
+    OPI_TypeConversion.GetLine(OffsetFromStart);
+    OPI_TypeConversion.GetLine(FilterByType);
+    OPI_TypeConversion.GetBoolean(SortByDate);
+    
+    Headers = AuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    
+    If ValueFilled(Quantity) Then
+        Parameters.Insert("limit", OPI_Tools.NumberToString(Quantity));
+    EndIf;
+    
+    If ValueFilled(OffsetFromStart) Then
+        Parameters.Insert("offset", OPI_Tools.NumberToString(OffsetFromStart));
+    EndIf;
+    
+    If ValueFilled(FilterByType) Then
+        Parameters.Insert("media_type", FilterByType);
+    EndIf;
+    
+    If SortByDate Then
+        Destination = "last-uploaded";
+    Else
+        Destination = "files";
+    EndIf;
+    
+    Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Destination, Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Move object
+// Moves the object to the specified path and path to the original
+// 
+// Parameters:
+//  Token          - String - Token                                                   - token
+//  Original       - String - Path to the original file or folder                    - from
+//  Path           - String - Destination path for moving                         - to
+//  Overwrite - Boolean - Overwrite if a file with the same name already exists  - rewrite
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function MoveObject(Val Token, Val Original, Val Path, Val Overwrite = False) Export
+
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Original);
+    OPI_TypeConversion.GetLine(Path);
+    OPI_TypeConversion.GetBoolean(Overwrite);
+    
+    Headers = AuthorizationHeader(Token);
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources/move";
+    Href      = "href";
+    
+    Parameters = New Structure;
+    Parameters.Insert("from"       , Original);
+    Parameters.Insert("path"       , Path);
+    Parameters.Insert("overwrite"  , Overwrite);
+    
+    Parameters = OPI_Tools.RequestParametersToString(Parameters); 
+    Response     = OPI_Tools.Post(URL + Parameters, , Headers, False);  
+    ResponseURL = Response[Href]; 
+    
+    If Not ValueFilled(ResponseURL) Then
+    	Return Response;	
+    EndIf;
+    
+    Response = OPI_Tools.Get(ResponseURL, , Headers);
+    
+    Return Response;
+  
+EndFunction
+
+// Upload file
+// Uploads a file to disk at the specified path
+// 
+// Parameters:
+//  Token          - String                - Token                                                      - token
+//  Path           - String                - Path for saving the file to disk                         - path
+//  File           - String, BinaryData - File for upload                                          - file
+//  Overwrite - Boolean                - Overwrite if a file with the same name already exists    - rewrite
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex 
+Function UploadFile(Val Token, Val Path, Val File, Val Overwrite = False) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Path);
+    OPI_TypeConversion.GetBoolean(Overwrite);
+    OPI_TypeConversion.GetBinaryData(File);
+    
+    Headers = AuthorizationHeader(Token);
+    Href      = "href";   
+    File      = New Structure("file", File);
+    
+    Parameters = New Structure;
+    Parameters.Insert("path"       , Path);
+    Parameters.Insert("overwrite"  , Overwrite);
+    
+    Response  = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Parameters, Headers);
+    URL    = Response[Href];
+    
+    If Not ValueFilled(URL) Then
+    	Return Response;	
+    EndIf;
+        
+    Response  = OPI_Tools.PutMultipart(URL, New Structure(), File, "multipart", Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Upload file by URL
+// Downloads a file to disk from the specified URL
+// 
+// Parameters:
+//  Token - String - Token                               - token
+//  Path  - String - Path to place the downloaded file   - path
+//  Address - String - File URL                           - url
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function UploadFileByURL(Val Token, Val Path, Val Address) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Path);
+    OPI_TypeConversion.GetLine(Address);
+    
+    Headers = AuthorizationHeader(Token);
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources/upload";
+    
+    Parameters = New Structure;
+    Parameters.Insert("url" , EncodeString(Address, StringEncodingMethod.URLInURLEncoding));
+    Parameters.Insert("path", Path);
+    
+    Parameters = OPI_Tools.RequestParametersToString(Parameters); 
+    Response     = OPI_Tools.Post(URL + Parameters, , Headers, False);
+ 
+    Return Response;
+    
+EndFunction
+
+#EndRegion
+
+#Region ManagePublicAccess
+
+// Publish object
+// Publishes the disk object for public access
+// 
+// Parameters:
+//  Token - String - Token                        - token
+//  Path  - String - Path to the object to be published  - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex 
+Function PublishObject(Val Token, Val Path) Export
+    Return TogglePublicAccess(Token, Path, True);   
+EndFunction
+
+// Unpublish object
+// Unpublishes a previously published object
+// 
+// Parameters:
+//  Token - String - Token                                  - token
+//  Path  - String - Path to the previously published object   - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function CancelObjectPublication(Val Token, Val Path) Export
+    Return TogglePublicAccess(Token, Path, False);
+EndFunction
+
+// Get published list объеtoтоin.
+// Gets a list of published objects
+// 
+// Parameters:
+//  Token            - String - Token                                               - token      
+//  Quantity       - Number  - Number of returned objects                    - amount
+//  OffsetFromStart - Number  - Offset for getting objects not from the beginning of the list - offset
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function GetPublishedObjectsList(Val Token, Val Quantity = 0, Val OffsetFromStart = 0) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Quantity);
+    OPI_TypeConversion.GetLine(OffsetFromStart);
+    
+    Headers = AuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    
+    If ValueFilled(Quantity) Then
+        Parameters.Insert("limit", Quantity);
+    EndIf;
+    
+    If ValueFilled(OffsetFromStart) Then
+        Parameters.Insert("offset", OffsetFromStart);
+    EndIf;
+        
+    Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get public object
+// Gets information about the published object by its URL
+// 
+// Parameters:
+//  Token            - String - Token                                                           - token
+//  URL              - String - Object address                                                   - url 
+//  Quantity       - Number  - Quantity inозinращаемых inложенных объеtoтоin (for directory)       - amount
+//  OffsetFromStart - Number  - Offset for getting nested objects not from the beginning of the list   - offset
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function GetPublicObject(Val Token, Val URL, Val Quantity = 0, Val OffsetFromStart = 0) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(URL);
+    OPI_TypeConversion.GetLine(Quantity);
+    OPI_TypeConversion.GetLine(OffsetFromStart);
+    
+    Headers = AuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    
+    If ValueFilled(Quantity) Then
+        Parameters.Insert("limit", OPI_Tools.NumberToString(Quantity));
+    EndIf;
+    
+    If ValueFilled(OffsetFromStart) Then
+        Parameters.Insert("offset", OPI_Tools.NumberToString(OffsetFromStart));
+    EndIf;
+    
+    Parameters.Insert("public_key", URL);
+        
+    Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Parameters, Headers);
+    
+    Return Response;
+    
+EndFunction
+
+// Get download link for public object
+// Gets a direct link to download the public object
+// 
+// Parameters:
+//  Token - String - Token               - token
+//  URL   - String - Object address       - url
+//  Path  - String - Path inside the object - path
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function GetDownloadLinkForPublicObject(Val Token, Val URL, Val Path = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(URL);
+    OPI_TypeConversion.GetLine(Path);
+    
+    Headers = AuthorizationHeader(Token);
+    
+    Parameters = New Structure;
+    
+    If ValueFilled(Path) Then
+        Parameters.Insert("path", Path);
+    EndIf;
+        
+    Parameters.Insert("public_key", URL);
+        
+    Response = OPI_Tools.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Parameters, Headers);
+    
+    Return Response; 
+    
+EndFunction
+     
+// Save public object to disk
+// Saves the public object to your disk
+// 
+// Parameters:
+//  Token  - String - Token                                               - token
+//  URL    - String - Object address                                       - url
+//  From - String - Path inнутри публичного directory (тольtoо for папоto)  - from
+//  To   - String - File save path                               - to
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function SavePublicObjectToDisk(Val Token, Val URL, From = "", To = "") Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(URL);
+    OPI_TypeConversion.GetLine(From);
+    OPI_TypeConversion.GetLine(To);
+    
+    Headers  = AuthorizationHeader(Token);
+    Address      = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk";
+    Href       = "href";
+    
+    Parameters = New Structure;
+    Parameters.Insert("public_key", URL);
+    
+    If ValueFilled(From) Then
+        Parameters.Insert("path", From);
+    EndIf;
+    
+    If ValueFilled(To) Then
+        Parameters.Insert("save_path", To);
+    EndIf;
+    
+    Parameters = OPI_Tools.RequestParametersToString(Parameters); 
+    Response     = OPI_Tools.Post(Address + Parameters, , Headers, False);
+    
+    ResponseURL = Response[Href]; 
+    
+    If Not ValueFilled(ResponseURL) Then
+        Return Response;	
+    EndIf;
+        
+    Response = OPI_Tools.Get(ResponseURL, , Headers);
+    
+    Return Response;
+    
+EndFunction
+ 
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function AuthorizationHeader(Val Token)
+    
+    Headers = New Match;
+    Headers.Insert("Authorization", "OAuth " + Token);
+    
+    Return Headers;
+    
+EndFunction
+
+Function TogglePublicAccess(Val Token, Val Path, Val PublicAccess) 
+    
+    OPI_TypeConversion.GetLine(Token);
+    OPI_TypeConversion.GetLine(Path);
+    OPI_TypeConversion.GetBoolean(PublicAccess);
+    
+    Headers  = AuthorizationHeader(Token);
+    Destination = ?(PublicAccess, "publish", "unpublish");
+    Href       = "href";
+  
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources/" + Destination;
+    
+    Parameters = New Structure;
+    Parameters.Insert("path", Path);
+    
+    Parameters = OPI_Tools.RequestParametersToString(Parameters); 
+    Response     = OPI_Tools.Put(URL + Parameters, , Headers, False);
+    
+    ResponseURL = Response[Href];
+    
+    If Not ValueFilled(ResponseURL) Then
+        Return Response;	
+    EndIf;    
+     
+    Response     = OPI_Tools.Get(ResponseURL, , Headers);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo b/service/interim/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
new file mode 100644
index 0000000000..08aea07cf7
--- /dev/null
+++ b/service/interim/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>Methodы work with Yandex Disk (OPI)</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/service/interim/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
rename to service/interim/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo b/service/interim/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
new file mode 100644
index 0000000000..6329dbbaf4
--- /dev/null
+++ b/service/interim/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>Methodы work with Yandex ID (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
new file mode 100644
index 0000000000..a7b02db477
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
@@ -0,0 +1,1229 @@
+// Location OS: ./OInt/tools/Modules/internal/Modules/OPI_Tools.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
+
+#Region ServiceProgramInterface
+
+#Region HTTPMethods
+
+#Region RequestsWithoutBody
+
+Function Get(Val URL, Val Parameters = "", Val AdditionalHeaders = "", Val ResponseFile = Undefined) Export
+    Return ExecuteRequestWithoutBody(URL, "GET", Parameters, AdditionalHeaders, ResponseFile);
+EndFunction
+
+Function Delete(Val URL, Val Parameters = "", Val AdditionalHeaders = "", Val ResponseFile = Undefined) Export
+    Return ExecuteRequestWithoutBody(URL, "DELETE", Parameters, AdditionalHeaders, ResponseFile);
+EndFunction
+
+#EndRegion
+
+#Region RequestsWithBody
+
+Function Post(Val URL
+    , Val Parameters = ""
+    , Val AdditionalHeaders = ""
+    , Val JSON = True
+    , Val FullResponse = False
+    , Val ResponseFile = Undefined) Export
+    
+    Return ExecuteRequestWithBody(URL, "POST", Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile);
+    
+EndFunction
+
+Function Patch(Val URL
+    , Val Parameters = ""
+    , Val AdditionalHeaders = ""
+    , Val JSON = True
+    , Val FullResponse = False
+    , Val ResponseFile = Undefined) Export
+    
+    Return ExecuteRequestWithBody(URL, "PATCH", Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile);
+    
+EndFunction
+
+Function Put(Val URL
+    , Val Parameters = ""
+    , Val AdditionalHeaders = ""
+    , Val JSON = True
+    , Val FullResponse = False
+    , Val ResponseFile = Undefined) Export
+    
+    Return ExecuteRequestWithBody(URL, "PUT", Parameters, AdditionalHeaders, JSON, FullResponse, ResponseFile);
+    
+EndFunction
+
+Function PostBinary(Val URL
+    , Val Body
+    , Val AdditionalHeaders
+    , Val FullResponse = False
+    , Val DataType = "application/octet-stream") Export
+    
+    Return ExecuteRequestWithBinaryData(URL, "POST", Body, AdditionalHeaders, FullResponse, DataType);
+    
+EndFunction
+
+#EndRegion 
+
+#Region MultipartRequests
+
+Function PostMultipart(Val URL
+    , Val Parameters = ""
+    , Val Files = ""
+    , Val ContentType = "image/jpeg"
+    , Val AdditionalHeaders = ""
+    , Val ResponseFile = Undefined) Export
+
+    Return ExecuteMultipartRequest(URL, "POST", Parameters, Files, ContentType, AdditionalHeaders, ResponseFile);
+
+EndFunction
+
+Function PutMultipart(Val URL
+    , Val Parameters = ""
+    , Val Files = ""
+    , Val ContentType = "image/jpeg"
+    , Val AdditionalHeaders = ""
+    , Val ResponseFile = Undefined) Export
+
+    Return ExecuteMultipartRequest(URL, "PUT", Parameters, Files, ContentType, AdditionalHeaders, ResponseFile);
+
+EndFunction
+
+Function PostMultipartRelated(Val URL
+    , Val JSON = ""
+    , Val Files = ""
+    , Val AdditionalHeaders = ""
+    , Val ResponseFile = Undefined) Export
+       
+    Return ExecuteMultipartRelatedRequest(URL, "POST", JSON, Files, AdditionalHeaders, ResponseFile);
+    
+EndFunction
+
+Function PatchMultipartRelated(Val URL
+    , Val JSON = ""
+    , Val Files = ""
+    , Val AdditionalHeaders = ""
+    , Val ResponseFile = Undefined) Export  
+     
+    Return ExecuteMultipartRelatedRequest(URL, "PATCH", JSON, Files, AdditionalHeaders, ResponseFile);
+    
+EndFunction
+
+#EndRegion
+
+#Region Miscellaneous
+
+Procedure ProcessResponse(Response, Val FullResponse = False) Export 
+    
+    If FullResponse Or TypeValue(Response) <> Type("HTTPResponse") Then
+        Return;
+    EndIf;
+    
+    BodyFile = Response.GetBodyFileName();
+    
+    If Not BodyFile = Undefined Then
+        Response = BodyFile;
+        Return;
+    EndIf;
+    
+    GZip = "gzip";        
+    NeedsUnpacking = 
+        Response.Headers.Get("Content-Encoding") = GZip 
+        Or Response.Headers.Get("content-encoding") = GZip;
+    
+    If NeedsUnpacking Then
+        Response = UnpackResponse(Response);
+    EndIf;
+    
+    Response = ?(TypeValue(Response) = Type("HTTPResponse"), Response.GetBodyAsBinaryData(), Response);
+    
+    If TypeValue(Response) = Type("BinaryData") Then
+        
+        Try
+            Response = JsonToStructure(Response);
+        Except
+            Return;
+        EndTry;
+        
+    EndIf;
+    
+EndProcedure
+
+Function CreateRequest(Val Address, Val AdditionalHeaders = "", Val DataType = "") Export
+      
+    Headers = New Match;
+    Headers.Insert("Accept-Encoding", "gzip");
+    Headers.Insert("Accept"         , "*/*");
+    Headers.Insert("Connection"     , "keep-alive");
+    Headers.Insert("Accept-Charset" , "utf-8");
+   
+    If ValueFilled(DataType) Then
+        Headers.Insert("Content-Type", DataType);
+    EndIf;
+       
+    If TypeValue(AdditionalHeaders) = Type("Match") Then
+        
+        For Each Title In AdditionalHeaders Do
+            Headers.Insert(Title.Key, Title.Value);
+        EndDo;
+        
+    EndIf;
+    
+    NewRequest = New HTTPRequest(Address, Headers);
+    
+    Return NewRequest;
+    
+EndFunction
+
+Function CreateConnection(Val Server, Val User = "", Val Password = "") Export
+    
+    Try 
+        SSL = New SecureConnectionOpenSSL;
+        Return New HTTPConnection(Server, 443, User, Password, , 3000, SSL);
+    Except
+        Return New HTTPConnection(Server, 443, User, Password, , 3000);
+    EndTry;
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
+
+#Region Service
+
+Function RequestParametersToString(Val Parameters) Export
+
+    If Parameters.Quantity() = 0 Then
+        Return "";
+    EndIf;
+
+    ParameterString = "?";
+
+    For Each Parameter In Parameters Do
+        
+        ParameterValue = ConvertParameterToString(Parameter.Value);
+        
+        ParameterString = ParameterString 
+            + Parameter.Key 
+            + "=" 
+            + ParameterValue
+            + "&";
+    EndDo;
+
+    ParameterString = Left(ParameterString, StrLength(ParameterString) - 1);
+
+    Return ParameterString;
+
+EndFunction
+
+Function SplitURL(Val URL) Export
+
+    URL = StringReplace(URL, "https://", "");
+    URL = StringReplace(URL, "http://", "");
+    URL = StringReplace(URL, ":443", "");
+
+    Address  = Right(URL, StrLength(URL) - StrFind(URL, "/", SearchDirection.FromStart) + 1);
+    Server = Left(URL, StrFind(URL, "/", SearchDirection.FromStart) - 1);
+    
+    Try        
+        SSL = New SecureConnectionOpenSSL;   
+    Except
+        Server = "https://" + Server;
+    EndTry;
+      
+    ReturnStructure = New Structure;
+    ReturnStructure.Insert("Server", Server);
+    ReturnStructure.Insert("Address" , Address);
+
+    Return ReturnStructure;
+
+EndFunction
+
+Function JsonToStructure(Val Text) Export
+
+    If Not ValueFilled(Text) Then
+        Return "";
+    EndIf;
+    
+    Text = ?(TypeValue(Text) = Type("BinaryData"), GetStringFromBinaryData(Text), Text);
+
+    ReadingJSON = New ReadingJSON;
+    ReadingJSON.SetString(Text);
+
+    Data = ReadJSON(ReadingJSON, True, Undefined, JSONDateFormat.ISO);
+    ReadingJSON.Close();
+
+    Return Data;
+
+EndFunction
+
+Function JSONString(Val Data, Val Escaping = "No") Export
+
+    JSONParameters = New JSONWriteParameters(JSONLineBreak.Windows
+        , " "
+        , True
+        , EscapeJSONCharacters[Escaping]
+        , False
+        , False
+        , False
+        , False);
+
+    Try
+        
+        WritingJSON = New WritingJSON;
+        WritingJSON.SetString(JSONParameters);
+    
+        WriteJSON(WritingJSON, Data);
+        Return WritingJSON.Close();
+    
+    Except      
+        Return "NOT JSON: " + String(Data);
+    EndTry;
+
+EndFunction
+
+Function NumberToString(Val Number) Export
+    Return StringReplace(String(Number), Symbols.NPP, "");
+EndFunction
+
+Function ReadJSONFile(Val Path) Export
+    
+    ReadingJSON = New ReadingJSON;
+    ReadingJSON.OpenFile(Path);  
+    Values = ReadJSON(ReadingJSON);
+    
+    ReadingJSON.Close();
+    
+    Return Values;
+    
+EndFunction
+
+Function RequestParametersToMatch(Val ParameterString) Export
+
+    ReturnMapping = New Match;
+    NumberOfParts     = 2;
+    ParameterArray     = StrSplit(ParameterString, "&", False);
+
+    For Each Parameter In ParameterArray Do
+
+        KeyValueArray = StrSplit(Parameter, "=");
+
+        If KeyValueArray.Quantity() = NumberOfParts Then
+            ReturnMapping.Insert(KeyValueArray[0], KeyValueArray[1]);
+        EndIf;
+
+    EndDo;
+
+    Return ReturnMapping;
+
+EndFunction
+
+Function GetCurrentDate() Export
+    Return LocalTime(CurrentUniversalDate());    
+EndFunction
+
+Function UNIXTime(Val Date) Export
+    
+    OTD  = New TypeDescription("Date");
+    Date = OTD.ConvertValue(Date);
+    
+    UNIX = Format(Date - Date(1970, 1, 1, 1, 0, 0), "HC=10; HDC=0; HG=0");
+    UNIX = StringReplace(UNIX, ",", "");
+    UNIX = Left(UNIX, 10);
+    
+    Return UNIX;
+    
+EndFunction
+
+Function ProgressInformation(Val Current, Val Total, Val Unit, Val Divider = 1) Export
+    
+    Whole   = 100;
+    Current = Round(Current / Divider, 2);
+    Total   = Round(Total / Divider, 2); 
+    Percent = Goal(Current / Total * Whole);
+             
+    StrCurrent = NumberToString(Current);
+    StrTotal   = NumberToString(Total);
+    StrPercentage = NumberToString(Percent);
+   
+    Information = StrCurrent + "/" + StrTotal + " " + Unit + " ( " + StrPercentage + "% )";
+    
+    Return Information;
+    
+EndFunction
+
+Function ConvertDataWithSizeRetrieval(Data, Val MinimumStreamSize = 0) Export
+    
+    Size = 0;
+    
+    If TypeValue(Data) = Type("String") Then
+        
+        FileOnDisk = New File(Data);
+        
+        If FileOnDisk.Exists() Then         
+            Size = FileOnDisk.Size(); 
+        Else
+            OPI_TypeConversion.GetBinaryData(Data);
+            Size = Data.Size();
+        EndIf;
+        
+    Else
+        OPI_TypeConversion.GetBinaryData(Data);
+        Size = Data.Size();
+    EndIf;
+    
+    If ValueFilled(MinimumStreamSize) Then
+        If Size < MinimumStreamSize Then
+            OPI_TypeConversion.GetBinaryData(Data);
+        Else
+            OPI_TypeConversion.GetBinaryOrStream(Data);    
+        EndIf;     
+    Else
+        OPI_TypeConversion.GetBinaryOrStream(Data);
+    EndIf;
+    
+    Return Size;
+    
+EndFunction
+
+Procedure ValueToArray(Value) Export
+    
+    Value_ = New Array;
+    Value_.Add(Value);
+    Value = Value_;
+
+EndProcedure
+
+Procedure ReplaceSpecialCharacters(Text, Markup = "Markdown") Export
+    
+    CharacterMapping = New Match;
+    
+    If Markup = "HTML" Then
+        
+        CharacterMapping.Insert("&", "&amp;");
+        
+    ElsIf Markup = "MarkdownV2" Then
+        
+        CharacterMapping.Insert("-", "\-");
+        CharacterMapping.Insert("+", "\+");
+        CharacterMapping.Insert("#", "\#");        
+        CharacterMapping.Insert("=", "\=");
+        CharacterMapping.Insert("{", "\{");        
+        CharacterMapping.Insert("}", "\}");        
+        CharacterMapping.Insert(".", "\.");
+      
+    Else
+        Return;
+    EndIf;         
+
+    For Each ArraySymbol In CharacterMapping Do
+        Text = StringReplace(Text, ArraySymbol.Key, ArraySymbol.Value);
+    EndDo;
+
+EndProcedure
+
+Procedure RemoveEmptyCollectionFields(Collection) Export
+    
+    CollectionType        = TypeValue(Collection);
+    OutputCollection   = New(CollectionType);
+    
+    If CollectionType = Type("Match") Or CollectionType = Type("Structure") Then
+        
+        RemoveEmptyKeyValues(Collection, OutputCollection);
+        
+    ElsIf CollectionType = Type("Array") Then
+        
+        RemoveEmptyArrayElements(Collection, OutputCollection);
+        
+    Else
+        
+        OutputCollection = Collection;
+        
+    EndIf;
+    
+    Collection = OutputCollection;
+    
+EndProcedure
+
+Procedure Pause(Val Seconds) Export
+    
+    Connection = New HTTPConnection("1C.ru", 11111, , , , Seconds);
+    Try
+        Connection.Get(New HTTPRequest(""));
+    Except
+        Return;  
+    EndTry;
+    
+EndProcedure
+
+Procedure AddField(Val Name, Val Value, Val Type, Collection) Export
+    
+    Filled = ValueFilled(Value);
+    
+    If Not Filled Then
+        Return;
+    EndIf;
+    
+    If Type = "Date" Then
+        OPI_TypeConversion.GetDate(Value);
+        Value = UNIXTime(Value);
+        
+    ElsIf Type = "Collection" Then
+        OPI_TypeConversion.GetCollection(Value); 
+        
+    ElsIf Type = "Boolean" Then
+        OPI_TypeConversion.GetBoolean(Value); 
+        
+    ElsIf Type = "FileString" Then
+        OPI_TypeConversion.GetLine(Value, True);
+        
+    ElsIf Type = "Array" Then
+        OPI_TypeConversion.GetArray(Value);
+        
+    ElsIf Type = "BinaryData" Then
+        OPI_TypeConversion.GetBinaryData(Value);
+        
+    ElsIf Type = "Number" Then
+        OPI_TypeConversion.GetNumber(Value);
+        
+    Else
+        OPI_TypeConversion.GetLine(Value);
+        
+    EndIf;
+    
+    Collection.Insert(Name, Value);
+    
+EndProcedure
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function ExecuteRequestWithBody(Val URL
+    , Val View
+    , Val Parameters = ""
+    , Val AdditionalHeaders = ""
+    , Val JSON = True
+    , Val FullResponse = False
+    , Val ResponseFile = Undefined)
+    
+    If Not ValueFilled(Parameters) Then
+        Parameters = New Structure;
+    EndIf;
+    
+    DataType     = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");   
+    URLStructure  = SplitURL(URL);
+    Server        = URLStructure["Server"];
+    Address         = URLStructure["Address"];
+    
+    Request        = CreateRequest(Address, AdditionalHeaders, DataType);
+    Connection    = CreateConnection(Server);
+    
+    SetRequestBody(Request, Parameters, JSON);
+
+    If ValueFilled(ResponseFile) Then
+        Response = Connection.CallHTTPMethod(View, Request, ResponseFile);
+    Else
+        Response = Connection.CallHTTPMethod(View, Request);
+    EndIf;
+     
+    If ThisIsRedirection(Response) Then  
+        Response = ExecuteRequestWithBody(Response.Headers["Location"]
+            , View
+            , Parameters
+            , AdditionalHeaders
+            , JSON
+            , FullResponse
+            , ResponseFile);    
+    Else    
+        ProcessResponse(Response, FullResponse);      
+    EndIf;
+
+    Return Response;
+
+EndFunction
+
+Function ExecuteRequestWithBinaryData(Val URL
+    , Val View
+    , Val Data
+    , Val AdditionalHeaders
+    , Val FullResponse
+    , Val DataType)
+    
+    URLStructure  = SplitURL(URL);
+    Server        = URLStructure["Server"];
+    Address         = URLStructure["Address"];
+    
+    Request        = CreateRequest(Address, AdditionalHeaders, DataType);
+    Connection    = CreateConnection(Server);
+    
+    Request.SetBodyFromBinaryData(Data);
+    
+    Response = Connection.CallHTTPMethod(View, Request);
+
+    If ThisIsRedirection(Response) Then  
+        Response = ExecuteRequestWithBinaryData(Response.Headers["Location"]
+            , View
+            , Data
+            , AdditionalHeaders
+            , FullResponse
+            , DataType);    
+    Else    
+        ProcessResponse(Response, FullResponse);      
+    EndIf;
+
+    Return Response;
+
+EndFunction
+
+Function ExecuteRequestWithoutBody(Val URL
+    , Val View
+    , Val Parameters = ""
+    , Val AdditionalHeaders = ""
+    , Val ResponseFile = Undefined)
+    
+    If Not ValueFilled(Parameters) Then
+        Parameters = New Structure;
+    EndIf;
+
+    URLStructure        = SplitURL(URL);
+    Server              = URLStructure["Server"];
+    Address               = URLStructure["Address"] + RequestParametersToString(Parameters);
+    
+    Request     = CreateRequest(Address, AdditionalHeaders);
+    Connection = CreateConnection(Server);  
+     
+    If ValueFilled(ResponseFile) Then
+        Response = Connection.CallHTTPMethod(View, Request, ResponseFile);
+    Else
+        Response = Connection.CallHTTPMethod(View, Request);
+    EndIf;
+      
+    If ThisIsRedirection(Response) Then  
+        Response = ExecuteRequestWithoutBody(Response.Headers["Location"], View, Parameters, AdditionalHeaders, ResponseFile);    
+    Else    
+        ProcessResponse(Response);      
+    EndIf;
+
+    Return Response;
+    
+EndFunction
+
+Function ExecuteMultipartRequest(Val URL
+    , Val View
+    , Val Parameters = ""
+    , Val Files = ""
+    , Val ContentType = "image/jpeg"
+    , Val AdditionalHeaders = ""
+    , Val ResponseFile = Undefined)
+    
+    If Not ValueFilled(Parameters) Then
+        Parameters = New Structure;
+    EndIf;
+
+    If Not ValueFilled(Files) Then
+        Files = New Match;
+    EndIf;
+
+    Redirection    = 300;
+    Error           = 400;
+    Boundary         = StringReplace(String(New UniqueIdentifier), "-", "");
+    LineSeparator = Symbols.VK + Symbols.PS;
+    DataType        = "multipart/form-data; boundary=" + Boundary;
+    URLStructure     = SplitURL(URL);
+    Server           = URLStructure["Server"];
+    Address            = URLStructure["Address"];
+    
+    Request        = CreateRequest(Address, AdditionalHeaders, DataType);
+    Connection    = CreateConnection(Server);
+    
+    RequestBody  = GetTempFileName();
+    TextRecord = New DataRecording(RequestBody
+        , TextEncoding.UTF8
+        , ByteOrder.LittleEndian
+        , ""
+        , False
+        , ""
+        , False);
+
+    WriteMultipartParameters(TextRecord, Boundary, Parameters);
+    WriteMultipartFiles(TextRecord, Boundary, ContentType, Files);
+    
+    TextRecord.WriteString("--" + boundary + "--" + LineSeparator);
+    TextRecord.Close();
+
+    Request.SetBodyFileName(RequestBody);
+    
+    If ValueFilled(ResponseFile) Then
+        Response = Connection.CallHTTPMethod(View, Request, ResponseFile);
+    Else
+        Response = Connection.CallHTTPMethod(View, Request);
+    EndIf;
+        
+    ThisIsRedirection = Response.StatusCode >= Redirection And Response.StatusCode < Error;
+   
+    If ThisIsRedirection Then  
+        Response = ExecuteMultipartRequest(Response.Headers["Location"]
+            , View
+            , Parameters
+            , Files
+            , ContentType
+            , AdditionalHeaders
+            , ResponseFile);    
+    Else    
+        ProcessResponse(Response);      
+    EndIf;
+    
+    Request       = Undefined;
+    TextRecord = Undefined;
+    
+    DeleteFiles(RequestBody);
+    Return Response;
+       
+EndFunction
+
+Function ExecuteMultipartRelatedRequest(Val URL
+    , Val View
+    , Val JSON = ""
+    , Val Files = ""
+    , Val AdditionalHeaders = ""
+    , Val ResponseFile = Undefined) 
+    
+    Redirection    = 300;
+    Error           = 400;
+    Boundary         = StringReplace(String(New UniqueIdentifier), "-", "");
+    LineSeparator = Symbols.VK + Symbols.PS;
+    DataType        = "multipart/related; boundary=" + Boundary;
+    URLStructure     = SplitURL(URL);
+    Server           = URLStructure["Server"];
+    Address            = URLStructure["Address"];
+    
+    Request        = CreateRequest(Address, AdditionalHeaders, DataType);
+    Connection    = CreateConnection(Server);
+    
+    RequestBody  = GetTempFileName();
+    TextRecord = New DataRecording(RequestBody
+        , TextEncoding.UTF8
+        , ByteOrder.LittleEndian
+        , ""
+        , False
+        , ""
+        , False);
+    
+    WriteJSONMultipart(TextRecord, Boundary, JSON);
+    WriteRelatedFiles(TextRecord, Boundary, Files);        
+    
+    TextRecord.WriteString("--" + boundary + "--" + LineSeparator);
+    TextRecord.Close();
+    
+    AddContentLength(Request);
+    
+    Request.SetBodyFileName(RequestBody);
+    
+    If ValueFilled(ResponseFile) Then
+        Response = Connection.CallHTTPMethod(View, Request, ResponseFile);
+    Else
+        Response = Connection.CallHTTPMethod(View, Request);
+    EndIf;
+        
+    ThisIsRedirection = Response.StatusCode >= Redirection And Response.StatusCode < Error;
+    
+    If ThisIsRedirection Then  
+        Response = ExecuteMultipartRelatedRequest(Response.Headers["Location"]
+            , View
+            , JSON
+            , Files
+            , AdditionalHeaders
+            , ResponseFile);    
+    Else    
+        ProcessResponse(Response);      
+    EndIf;
+    
+    Request       = Undefined;
+    TextRecord = Undefined;
+
+    DeleteFiles(RequestBody);
+    Return Response;
+
+EndFunction
+
+Function ThisIsRedirection(Val Response)
+    
+    Redirection  = 300;
+    Error         = 400;
+
+    ThisIsRedirection = Response.StatusCode >= Redirection 
+        And Response.StatusCode < Error
+        And ValueFilled(Response.Headers["Location"]);
+    
+    Return ThisIsRedirection;
+    
+EndFunction
+
+Function ConvertParameterToString(Val Value)
+
+    If TypeValue(Value) = Type("Array") Then
+        Value = StrJoin(Value, ",");
+        Value = EncodeString(Value, StringEncodingMethod.URLencoding);
+        Value = "[" + Value + "]"; 
+    Else
+        Value = NumberToString(Value);
+        Value = EncodeString(Value, StringEncodingMethod.URLencoding);
+    EndIf;
+    
+    Return Value;
+    
+EndFunction
+
+Procedure SetRequestBody(Request, Val Parameters, Val JSON)
+    
+    Collection = TypeValue(Parameters) = Type("Structure") 
+        Or TypeValue(Parameters) = Type("Match")
+        Or TypeValue(Parameters) = Type("Array");
+        
+    If JSON Then
+        Data           = JSONString(Parameters);
+    ElsIf Not Collection Then
+        Data = Parameters;
+    Else
+        ParameterString = RequestParametersToString(Parameters);
+        Data           = Right(ParameterString, StrLength(ParameterString) - 1);
+    EndIf;
+    
+    If TypeValue(Data) = Type("String") Then
+        Request.SetBodyFromString(Data);
+    Else
+        //@skip-check wrong-type-expression
+        Request.SetBodyFromBinaryData(Data);
+    EndIf;
+    
+EndProcedure
+
+Procedure WriteMultipartParameters(TextRecord, Val Boundary, Val Parameters)
+    
+    LineSeparator = Symbols.VK + Symbols.PS;
+    
+    For Each Parameter In Parameters Do
+        
+        If Parameter.Value = Undefined
+            Or Parameter.Value = NULL Then
+            Continue;
+        EndIf;
+        
+        TextRecord.WriteString("--" + boundary + LineSeparator);
+        TextRecord.WriteString("Content-Disposition: form-data; name=""" + Parameter.Key + """");
+        TextRecord.WriteString(LineSeparator);
+        TextRecord.WriteString(LineSeparator);
+        
+        If TypeValue(Parameter.Value) = Type("String") 
+            Or TypeValue(Parameter.Value) = Type("Number") Then
+            
+            ValueAsString = NumberToString(Parameter.Value);
+            TextRecord.WriteString(ValueAsString);
+            
+        ElsIf TypeValue(Parameter.Value) = Type("Boolean") Then
+            
+            TextRecord.WriteString(?(Parameter.Value, "true", "false"));
+            
+        Else
+            
+            TextRecord.Write(Parameter.Value);
+            
+        EndIf;
+        
+        TextRecord.WriteString(LineSeparator);
+        
+    EndDo;
+    
+EndProcedure
+
+Procedure WriteMultipartFiles(TextRecord, Val Boundary, Val ContentType, Val Files)
+    
+    ContentType      = ShortLP(ContentType);
+    LineSeparator = Symbols.VK + Symbols.PS;
+    DotReplacement      = "___";
+    
+    For Each File In Files Do
+        
+        FilePath = StringReplace(File.Key, DotReplacement, ".");
+        
+        If ContentType = "image/jpeg" Then
+            SendingFileName = "photo";
+        Else
+            SendingFileName = StringReplace(File.Key, DotReplacement, ".");
+            SendingFileName = Left(SendingFileName, StrFind(SendingFileName, ".") - 1);
+            SendingFileName = ?(ValueFilled(SendingFileName), SendingFileName, StringReplace(File.Key,
+            DotReplacement, "."));
+        EndIf;
+        
+        TextRecord.WriteString("--" + boundary + LineSeparator);
+        TextRecord.WriteString("Content-Disposition: form-data; name=""" 
+            + SendingFileName 
+            + """; filename=""" 
+            + FilePath
+            + """");
+        TextRecord.WriteString(LineSeparator);      
+        
+        If ValueFilled(ContentType) Then
+            TextRecord.WriteString("Content-Type: " + ContentType);
+        EndIf;
+        
+        TextRecord.WriteString(LineSeparator);
+        TextRecord.WriteString(LineSeparator);
+        WriteBinaryData(TextRecord, File.Value);
+        TextRecord.WriteString(LineSeparator);
+        
+    EndDo;
+
+EndProcedure
+
+Procedure WriteRelatedFiles(TextRecord, Val Boundary, Val Files)
+    
+    If Not ValueFilled(Files) Then
+        Return;
+    EndIf;
+    
+    LineSeparator = Symbols.VK + Symbols.PS;
+    
+    If TypeValue(Files) = Type("Match") Then
+        For Each File In Files Do
+            
+            TextRecord.WriteString("--" + boundary + LineSeparator);
+            TextRecord.WriteString("Content-Type: " + File.Value);
+            TextRecord.WriteString(LineSeparator);
+            TextRecord.WriteString(LineSeparator);
+            WriteBinaryData(TextRecord, File.Key);
+            TextRecord.WriteString(LineSeparator);
+            TextRecord.WriteString(LineSeparator);
+            
+        EndDo;
+        
+    EndIf;
+
+EndProcedure
+
+Procedure WriteBinaryData(DataRecording, Val BinaryData)
+    
+    ChunkSize      = 268435456;
+    BytesRead   = 0;
+    CurrentPosition   = 0;
+    TotalSize      = BinaryData.Size();
+
+    WHile BytesRead < TotalSize Do
+        
+        ReadingData     = New ReadingData(BinaryData);
+        BytesRead   = ReadingData.Skip(CurrentPosition);
+        Result        = ReadingData.Read(ChunkSize);
+        Current data    = Result.GetBinaryData();
+        CurrentSize    = Current data.Size();
+        
+        If Not ValueFilled(Current data) Then
+            Break;
+        EndIf;
+
+        DataRecording.Write(Current data);
+        
+        // !OInt ReleaseObject(Current data);
+        // !OInt PerformGarbageCollection();
+
+        CurrentPosition = CurrentPosition + CurrentSize;
+        
+    EndDo;
+
+EndProcedure
+
+Procedure WriteJSONMultipart(TextRecord, Val Boundary, Val JSON)
+    
+    If Not ValueFilled(JSON) Then
+        Return;
+    EndIf;
+    
+    LineSeparator = Symbols.VK + Symbols.PS;
+    
+    TextRecord.WriteString("--" + boundary + LineSeparator);
+    TextRecord.WriteString("Content-Type: application/json; charset=UTF-8");
+    TextRecord.WriteString(LineSeparator);
+    TextRecord.WriteString(LineSeparator);
+    TextRecord.WriteString(JSON);
+    TextRecord.WriteString(LineSeparator);
+    TextRecord.WriteString(LineSeparator);
+
+EndProcedure
+
+Procedure AddContentLength(Request)
+    
+    RequestBody = Request.GetBodyAsBinaryData();
+    
+    If ValueFilled(RequestBody) Then
+        
+        Size = RequestBody.Size();
+        Request.Headers.Insert("Content-Length", NumberToString(Size));
+        
+    EndIf;
+
+EndProcedure
+
+Procedure RemoveEmptyKeyValues(Val Collection, OutputCollection)
+    
+    For Each CollectionItem In Collection Do
+        
+        If Not CollectionItem.Value = Undefined And Not CollectionItem.Value = NULL Then
+            OutputCollection.Insert(CollectionItem.Key, CollectionItem.Value);
+        EndIf;
+        
+    EndDo;
+    
+EndProcedure
+
+Procedure RemoveEmptyArrayElements(Val Collection, OutputCollection)
+    
+    For Each CollectionItem In Collection Do
+        
+        If Not CollectionItem = Undefined And Not CollectionItem = NULL Then
+            OutputCollection.Add(CollectionItem);
+        EndIf;
+        
+    EndDo;
+    
+EndProcedure
+
+#Region GZip
+
+// Description withтруtoтур withм. зdеwithь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
+// Source: https://github.com/vbondarevsky/Connector 
+
+// Connector: convenient HTTP client for 1C:Enterprise 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
+// Version: 2.4.8
+//
+// Requirements: 1C platform version 8.3.10 and above
+
+Function UnpackResponse(Response)
+
+    Try
+        Return ReadGZip(Response.GetBodyAsBinaryData());
+    Except
+        Return Response;
+    EndTry;
+
+EndFunction
+
+Function ReadGZip(CompressedData) Export
+
+    GZipPrefixSize  = 10;
+    GZipPostfixSize = 8;
+    
+    SizeDD  = ZipSizeDD();
+    SizeCDH = ZipSizeCDH();
+    SizeESD = ZipSizeEOCD();
+    SizeLFH = ZipSizeLFH();
+
+    ReadingData = New ReadingData(CompressedData);
+    ReadingData.Skip(GZipPrefixSize);
+    CompressedDataSize = ReadingData.SourceStream().Size() - GZipPrefixSize - GZipPostfixSize;
+
+    ZipStream     = New MemoryStream(SizeLFH 
+       + CompressedDataSize 
+       + SizeDD 
+       + SizeCDH 
+       + SizeESD);
+       
+    DataRecording = New DataRecording(ZipStream);
+    DataRecording.WriteBinaryDataBuffer(ZipLFH());
+    ReadingData.CopyTo(DataRecording, CompressedDataSize);
+
+    DataRecording.Close();
+    DataRecording = New DataRecording(ZipStream);
+
+    CRC32 = ReadingData.ReadInt32();
+    UncompressedDataSize = ReadingData.ReadInt32();
+    ReadingData.Close();
+
+    DataRecording.WriteBinaryDataBuffer(ZipDD(CRC32, CompressedDataSize, UncompressedDataSize));
+    DataRecording.WriteBinaryDataBuffer(ZipCDH(CRC32, CompressedDataSize, UncompressedDataSize));
+    DataRecording.WriteBinaryDataBuffer(ZipEOCD(CompressedDataSize));
+    DataRecording.Close();
+
+    Return ReadZip(ZipStream);
+
+EndFunction
+
+Function ReadZip(CompressedData, ErrorText = Undefined)
+
+    Directory   = GetTempFileName();
+    ReadingZip = New ReadingZipFile(CompressedData);
+    FileName  = ReadingZip.Elements[0].Name;
+    Try
+        ReadingZip.Extract(ReadingZip.Elements[0], Directory, ZIPFilePathRecoveryMode.DoNotRestore);
+    Except
+        // Ignore archive integrity check, just read the result
+        ErrorText = DetailedErrorRepresentation(ErrorInformation());
+    EndTry;
+    ReadingZip.Close();
+
+    Result = New BinaryData(Directory + GetPathSeparator() + FileName);
+    DeleteFiles(Directory);
+
+    Return Result;
+
+EndFunction
+
+Function ZipSizeLFH()
+
+    Return 34;
+
+EndFunction
+
+Function ZipSizeDD()
+
+    Return 16;
+
+EndFunction
+
+Function ZipSizeCDH()
+
+    Return 50;
+
+EndFunction
+
+Function ZipSizeEOCD()
+
+    Return 22;
+
+EndFunction
+
+Function ZipLFH()
+    
+    // Local file header
+    Buffer = New BinaryDataBuffer(ZipSizeLFH());
+    Buffer.WriteInt32(0, 67324752); // signature 0x04034b50
+    Buffer.WriteInt16(4, 20);       // version
+    Buffer.WriteInt16(6, 10);       // bit flags    
+    Buffer.WriteInt16(8, 8);        // compression method
+    Buffer.WriteInt16(10, 0);       // time
+    Buffer.WriteInt16(12, 0);       // date
+    Buffer.WriteInt32(14, 0);       // crc-32
+    Buffer.WriteInt32(18, 0);       // compressed size
+    Buffer.WriteInt32(22, 0);       // uncompressed size
+    Buffer.WriteInt16(26, 4);       // filename legth - "data"
+    Buffer.WriteInt16(28, 0);       // extra field length
+    Buffer.Write(30, GetBinaryDataBufferFromString("data", "ascii", False));
+
+    Return Buffer;
+
+EndFunction
+
+Function ZipDD(CRC32, CompressedDataSize, UncompressedDataSize)
+    
+    // Data descriptor
+    Buffer = New BinaryDataBuffer(ZipSizeDD());
+    Buffer.WriteInt32(0, 134695760);
+    Buffer.WriteInt32(4, CRC32);
+    Buffer.WriteInt32(8, CompressedDataSize);
+    Buffer.WriteInt32(12, UncompressedDataSize);
+
+    Return Buffer;
+
+EndFunction
+
+Function ZipCDH(CRC32, CompressedDataSize, UncompressedDataSize)
+    
+    // Central directory header
+    Buffer = New BinaryDataBuffer(ZipSizeCDH());
+    Buffer.WriteInt32(0, 33639248);              // signature 0x02014b50
+    Buffer.WriteInt16(4, 798);                   // version made by
+    Buffer.WriteInt16(6, 20);                    // version needed to extract
+    Buffer.WriteInt16(8, 10);                    // bit flags
+    Buffer.WriteInt16(10, 8);                    // compression method
+    Buffer.WriteInt16(12, 0);                    // time
+    Buffer.WriteInt16(14, 0);                    // date
+    Buffer.WriteInt32(16, CRC32);                // crc-32
+    Buffer.WriteInt32(20, CompressedDataSize);   // compressed size
+    Buffer.WriteInt32(24, UncompressedDataSize); // uncompressed size
+    Buffer.WriteInt16(28, 4);                    // file name length
+    Buffer.WriteInt16(30, 0);                    // extra field length
+    Buffer.WriteInt16(32, 0);                    // file comment length
+    Buffer.WriteInt16(34, 0);                    // disk number start
+    Buffer.WriteInt16(36, 0);                    // internal file attributes
+    Buffer.WriteInt32(38, 2176057344);           // external file attributes
+    Buffer.WriteInt32(42, 0);                    // relative offset of local header
+    Buffer.Write(46, GetBinaryDataBufferFromString("data", "ascii", False));
+
+    Return Buffer;
+
+EndFunction
+
+Function ZipEOCD(CompressedDataSize)
+    
+    // End of central directory
+    SizeCDH = 50;
+    Buffer = New BinaryDataBuffer(ZipSizeEOCD());
+    Buffer.WriteInt32(0, 101010256); // signature 0x06054b50
+    Buffer.WriteInt16(4, 0); // number of this disk
+    Buffer.WriteInt16(6, 0); // number of the disk with the start of the central directory
+    Buffer.WriteInt16(8, 1); // total number of entries in the central directory on this disk
+    Buffer.WriteInt16(10, 1); // total number of entries in the central directory
+    Buffer.WriteInt32(12, SizeCDH); // size of the central directory    
+    // offset of start of central directory with respect to the starting disk number
+    Buffer.WriteInt32(16, ZipSizeLFH() + CompressedDataSize + ZipSizeDD());
+    Buffer.WriteInt16(20, 0); // the starting disk number
+
+    Return Buffer;
+
+EndFunction
+
+#EndRegion
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
new file mode 100644
index 0000000000..1684016796
--- /dev/null
+++ b/service/interim/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_Tools</name>
+  <synonym>
+    <key>ru</key>
+    <value>OPI инwithтрументы</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl
new file mode 100644
index 0000000000..a8586b49ca
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl
@@ -0,0 +1,110 @@
+// Location OS: ./OInt/tools/Modules/internal/Modules/OPI_Cryptography.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
+
+#Region ServiceProgramInterface
+
+#Region BSP
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2019, LLC 1C-Soft
+// All rights reserved. This program and accompanying materials are provided 
+// in withоотinетwithтinии with уwithлоinиями лицензии Attribution 4.0 International (CC BY 4.0)
+// License text available at:
+// https://creativecommons.org/licenses/by/4.0/legalcode
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Function HMACSHA256(Val Key, Val Data) Export
+    
+    Return HMAC(Key, Data, HashFunction.SHA256, 64);
+    
+EndFunction
+
+Function Hash(BinaryData, Type) Export
+    
+    Hashing = New DataHashing(Type);
+    Hashing.Add(BinaryData);
+    
+    Return Hashing.HashSum;
+        
+EndFunction
+
+Function HMAC(Val Key, Val Data, Type, BlockSize) Export
+    
+    Twice = 2;
+    
+    If Key.Size() > BlockSize Then
+        Key = Hash(Key, Type);
+    EndIf;
+    
+    If Key.Size() <= BlockSize Then
+        Key = GetHexStringFromBinaryData(Key);
+        Key = Left(Key + RepeatString("00", BlockSize), BlockSize * Twice);
+    EndIf;
+    
+    Key = GetBinaryDataBufferFromBinaryData(GetBinaryDataFromHexString(Key));
+    
+    Ipad = GetBinaryDataBufferFromHexString(RepeatString("36", BlockSize));
+    Opad = GetBinaryDataBufferFromHexString(RepeatString("5c", BlockSize));
+    
+    Ipad.WriteBitwiseExclusiveOr(0, Key);
+    Ikeypad = GetBinaryDataFromBinaryDataBuffer(ipad);
+    
+    Opad.WriteBitwiseExclusiveOr(0, Key);
+    Okeypad = GetBinaryDataFromBinaryDataBuffer(opad);
+    
+    Return Hash(ConcatenateBinaryData(okeypad, Hash(ConcatenateBinaryData(ikeypad, Data), Type)), Type);
+    
+EndFunction
+
+Function ConcatenateBinaryData(BinaryData1, BinaryData2) Export
+    
+    BinaryDataArray = New Array;
+    BinaryDataArray.Add(BinaryData1);
+    BinaryDataArray.Add(BinaryData2);
+    
+    Return JoinBinaryData(BinaryDataArray);
+    
+EndFunction
+
+Function RepeatString(String, Quantity) Export
+    
+    Parts = New Array(Quantity);
+    
+    For To = 1 For Quantity Do
+        Parts.Add(String);
+    EndDo;
+
+    Return StrJoin(Parts, "");
+    
+EndFunction
+
+#EndRegion
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo
new file mode 100644
index 0000000000..c8cd120ec4
--- /dev/null
+++ b/service/interim/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_Cryptography</name>
+  <synonym>
+    <key>ru</key>
+    <value>Toриптография (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
new file mode 100644
index 0000000000..94e64c8822
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
@@ -0,0 +1,470 @@
+// Location OS: ./OInt/tools/Modules/OPI_TestDataRetrieval.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
+
+// Uncomment if OneScript is executed
+// #Use "./internal"
+// #Use asserts
+
+#Region ServiceProgramInterface
+
+Function GetTestingSectionMapping() Export
+    
+    StandardDependencies = "[Decode, Build]";
+    GoogleDependencies        = "Testing-GoogleWorkspace";
+    
+    Sections = New Structure;
+    Sections.Insert("Telegram"       , StandardDependencies);
+    Sections.Insert("VK"             , StandardDependencies);
+    Sections.Insert("Viber"          , StandardDependencies);
+    Sections.Insert("Twitter"        , StandardDependencies);
+    Sections.Insert("YandexDisk"     , StandardDependencies);
+    Sections.Insert("GoogleWorkspace", StandardDependencies);
+    Sections.Insert("GoogleCalendar" , GoogleDependencies);      
+    Sections.Insert("GoogleDrive"    , GoogleDependencies);
+    Sections.Insert("GoogleSheets"   , GoogleDependencies);
+    Sections.Insert("Notion"         , StandardDependencies);
+    Sections.Insert("Slack"          , StandardDependencies);
+    Sections.Insert("Airtable"       , StandardDependencies);
+    Sections.Insert("Dropbox"        , StandardDependencies);
+        
+    Return Sections;
+    
+EndFunction
+
+Function GetTestTable() Export
+    
+    Telegram  = "Telegram";
+    VK = "VK";
+    YDisk     = "YandexDisk";
+    Calendar = "GoogleCalendar";
+    Twitter   = "Twitter";
+    Viber    = "Viber";
+    Drive     = "GoogleDrive";
+    VSpace    = "GoogleWorkspace";
+    Notion     = "Notion";
+    Slack      = "Slack";
+    Tables   = "GoogleSheets";
+    AirT      = "Airtable";
+    Dropbox  = "Dropbox";
+    
+    TestTable = New ValueTable;
+    TestTable.Columns.Add("Method");
+    TestTable.Columns.Add("Synonym");
+    TestTable.Columns.Add("Section");
+                                              
+    NewTest(TestTable, "Telegram_GetBotInfo"      , "Get bot information"       , Telegram);     
+    NewTest(TestTable, "Telegram_GetUpdates"          , "Get updates"            , Telegram);
+    NewTest(TestTable, "Telegram_SetWebhook"           , "Set Webhook"             , Telegram);
+    NewTest(TestTable, "Telegram_SendTextMessage" , "Send text message"  , Telegram);
+    NewTest(TestTable, "Telegram_SendImage"           , "Send image"             , Telegram);
+    NewTest(TestTable, "Telegram_SendVideo"              , "Send video"                , Telegram);
+    NewTest(TestTable, "Telegram_SendAudio"              , "Send audio"                , Telegram);
+    NewTest(TestTable, "Telegram_SendDocument"           , "Send document"             , Telegram);
+    NewTest(TestTable, "Telegram_SendGIF"              , "Send GIF"                , Telegram);
+    NewTest(TestTable, "Telegram_SendMediaGroup"        , "Send media group"          , Telegram);
+    NewTest(TestTable, "Telegram_SendLocation"     , "Send location"       , Telegram);
+    NewTest(TestTable, "Telegram_SendContact"            , "Send contact"              , Telegram);
+    NewTest(TestTable, "Telegram_SendPoll"              , "Send poll"                , Telegram);
+    NewTest(TestTable, "Telegram_ForwardMessage"          , "Forward message"            , Telegram);
+    NewTest(TestTable, "Telegram_BanUnban"                   , "Ban/Unban"                     , Telegram);
+    NewTest(TestTable, "Telegram_CreateInvitationLink"    , "Create invitation link"     , Telegram);
+    NewTest(TestTable, "Telegram_PinUnpinMessage" , "Pin/Unpin message"  , Telegram);
+    NewTest(TestTable, "Telegram_GetMemberCount"     , "Get participant count"      , Telegram);
+    NewTest(TestTable, "Telegram_GetForumAvatarsList", "Get forum avatars list", Telegram);
+    NewTest(TestTable, "Telegram_CreateDeleteForumTopic"    , "Create/Delete forum topic"    , Telegram);
+    NewTest(TestTable, "Telegram_ChangeMainTopicName"      , "Change main topic name"      , Telegram);
+    NewTest(TestTable, "Telegram_HideShowMainTopic"   , "Hide/Show main topic"   , Telegram);
+    
+    NewTest(TestTable, "VK_CreateTokenLink"               , "Create token retrieval link", VK);
+    NewTest(TestTable, "VK_CreateDeletePost"                , "Create/Delete post"           , VK);
+    NewTest(TestTable, "VK_CreateCompositePost"              , "Create/Delete composite post" , VK);
+    NewTest(TestTable, "VK_CreatePoll"                      , "Create poll"                  , VK);
+    NewTest(TestTable, "VK_SaveDeleteImage"          , "Add/Delete image"      , VK);
+    NewTest(TestTable, "VK_CreateStory"                    , "Create story"                , VK);
+    NewTest(TestTable, "VK_DiscussionMethods"                  , "Actions with discussions"        , VK);
+    NewTest(TestTable, "VK_LikeRepostComment"                 , "Like/Repost/Comment"        , VK);
+    NewTest(TestTable, "VK_GetStatistics"                , "Get statistics"            , VK);
+    NewTest(TestTable, "VK_GetPostStatistics"          , "Get post statistics"     , VK);
+    NewTest(TestTable, "VK_CreateAdCampaign"          , "Create advertising campaign"     , VK);
+    NewTest(TestTable, "VK_SendMessage"                , "Send message"            , VK);
+    NewTest(TestTable, "VK_GetProductCategories"          , "Get product categories"     , VK);
+    NewTest(TestTable, "VK_CreateProductSelection"              , "Create product and selection"       , VK);
+    NewTest(TestTable, "VK_CreateProductWithProperties"          , "Create product with properties"    , VK);
+    NewTest(TestTable, "VK_GetProductList"             , "Get product list"        , VK);
+    NewTest(TestTable, "VK_GetSelectionList"            , "Get selection list"       , VK);
+    NewTest(TestTable, "VK_GetPropertyList"             , "Get property list"        , VK);
+    NewTest(TestTable, "VK_GetOrderList"             , "Get order list"        , VK);
+    NewTest(TestTable, "VK_UploadVideo"                    , "Upload video"                , VK);
+    
+    NewTest(TestTable, "YDisk_GetDiskInfo"       , "Get disk information"    , YDisk);
+    NewTest(TestTable, "YDisk_CreateFolder"                   , "Create folder"                  , YDisk);
+    NewTest(TestTable, "YDisk_UploadByUrlAndGetObject", "Upload by URL and get"    , YDisk);
+    NewTest(TestTable, "YDisk_UploadDeleteFile"           , "Upload/Delete file"         , YDisk);
+    NewTest(TestTable, "YDisk_CreateObjectCopy"            , "Create object copy"          , YDisk);
+    NewTest(TestTable, "YDisk_GetDownloadLink"     , "Get download link"  , YDisk);
+    NewTest(TestTable, "YDisk_GetFileList"           , "Get list of files"         , YDisk);
+    NewTest(TestTable, "YDisk_MoveObject"              , "Move object"             , YDisk);
+    NewTest(TestTable, "YDisk_PublicObjectActions"      , "Actions with public objects", YDisk);
+    NewTest(TestTable, "YDisk_GetPublishedList"   , "Get published list" , YDisk);
+    
+    NewTest(TestTable, "GV_GetAuthorizationLink"         , "Get authorization link"    , VSpace);
+    NewTest(TestTable, "GV_GetToken"                     , "Get token"                 , VSpace);
+    NewTest(TestTable, "GV_UpdateToken"                     , "Refresh token"                 , VSpace);
+    
+    NewTest(TestTable, "GC_GetCalendarList"          , "Get list of calendars"     , Calendar);
+    NewTest(TestTable, "GC_CreateDeleteCalendar"           , "Create/Delete calendar"      , Calendar);
+    NewTest(TestTable, "GC_CreateDeleteEvent"             , "Create/Delete event"        , Calendar);
+    NewTest(TestTable, "GC_GetEventList"             , "Get list of events"        , Calendar);
+    
+    NewTest(TestTable, "GD_GetCatalogList"           , "Get list of directories"      , Drive);
+    NewTest(TestTable, "GD_UploadDeleteFile"              , "Upload/Delete file"         , Drive);
+    NewTest(TestTable, "GD_CreateDeleteComment"         , "Create/Delete Comment"    , Drive);
+    NewTest(TestTable, "GD_CreateCatalog"                    , "Create/Delete catalog"        , Drive);
+    
+    NewTest(TestTable, "GT_CreateTable"                    , "Create table"                , Tables);
+    NewTest(TestTable, "GT_GetTable"                   , "Get table"               , Tables);
+    NewTest(TestTable, "GT_FillClearCells"           , "Fill/Clear cells"      , Tables);
+    
+    NewTest(TestTable, "Twitter_GetAuthorizationLink"    , "Get authorization link"    , Twitter);
+    NewTest(TestTable, "Twitter_UpdateToken"                , "Refresh token"                 , Twitter);
+    NewTest(TestTable, "Twitter_CreateTextTweet"         , "Text tweet"                 , Twitter);
+    NewTest(TestTable, "Twitter_CreateTweetWithImage"        , "Tweet with image"               , Twitter);
+    NewTest(TestTable, "Twitter_CreateTweetWithVideo"            , "Tweet with video"                   , Twitter);
+    NewTest(TestTable, "Twitter_CreateTweetWithGif"              , "Tweet with gif"                     , Twitter);
+    NewTest(TestTable, "Twitter_CreateTweetWithPoll"          , "Tweet with poll"                 , Twitter);
+    
+    NewTest(TestTable, "Viber_GetChannelInfo"     , "Get channel info"     , Viber);
+    NewTest(TestTable, "Viber_GetUserData"    , "Get user data"   , Viber);
+    NewTest(TestTable, "Viber_GetOnlineUsers"   , "Get online users"  , Viber);
+    NewTest(TestTable, "Viber_SendTextMessage"   , "Send text message"  , Viber);
+    NewTest(TestTable, "Viber_SendImage"             , "Send image"             , Viber);
+    NewTest(TestTable, "Viber_SendFile"                 , "SendFile"                 , Viber);
+    NewTest(TestTable, "Viber_SendContact"              , "Send contact"              , Viber);
+    NewTest(TestTable, "Viber_SendLocation"              , "SendLocation"              , Viber);
+    NewTest(TestTable, "Viber_SendLink"               , "SendLink"               , Viber);
+    
+    NewTest(TestTable, "Notion_CreatePage"                , "Create page"               , Notion);
+    NewTest(TestTable, "Notion_CreateEditDatabase"            , "Create/Edit database"          , Notion);
+    NewTest(TestTable, "Notion_GetPageInfo"    , "Get page info" , Notion);
+    NewTest(TestTable, "Notion_GetDatabaseInfo"        , "Get database info"     , Notion);
+    NewTest(TestTable, "Notion_CreatePageInDatabase"           , "Create page in database"        , Notion);
+    NewTest(TestTable, "Notion_EditPageProperties"       , "Edit page properties"     , Notion);
+    NewTest(TestTable, "Notion_CreateDeleteBlock"             , "Create/Delete block"           , Notion);
+    NewTest(TestTable, "Notion_GetUsers"          , "Get users"         , Notion);
+    NewTest(TestTable, "Notion_GetUserData"     , "Get user data"   , Notion);
+    
+    NewTest(TestTable, "Slack_GetBotInfo"         , "Get bot information"     , Slack);
+    NewTest(TestTable, "Slack_GetUserList"     , "Get user list"  , Slack);
+    NewTest(TestTable, "Slack_GetRegionList"          , "Get region list"       , Slack);
+    NewTest(TestTable, "Slack_SendDeleteMessage"       , "Send/Delete message"    , Slack);
+    NewTest(TestTable, "Slack_SendDeleteEphemeral"       , "Send/Delete ephemeral"    , Slack);
+    NewTest(TestTable, "Slack_GetScheduledMessages"     , "Get scheduled messages"  , Slack);
+    NewTest(TestTable, "Slack_CreateArchiveChannel"        , "Create/Archive channel"     , Slack);
+    NewTest(TestTable, "Slack_GetChannelList"           , "Get channel list"        , Slack);
+    NewTest(TestTable, "Slack_OpenCloseDialog"            , "Open/Close dialog"         , Slack);
+    NewTest(TestTable, "Slack_GetFileList"            , "Get list of files"         , Slack);
+    NewTest(TestTable, "Slack_UploadDeleteFile"            , "Upload/Delete file"         , Slack);
+    NewTest(TestTable, "Slack_GetExternalFileList"                , "Get external file list"   , Slack);
+    NewTest(TestTable, "Slack_UploadDeleteExternalFile"              , "Upload/Delete external file"   , Slack);
+    
+    NewTest(TestTable, "AT_CreateDatabase"                       , "Create/Edit database"          , AirT);
+    NewTest(TestTable, "AT_CreateTable"                    , "Create/Edit table"       , AirT);
+    NewTest(TestTable, "AT_CreateField"                       , "Create/Edit field"          , AirT);
+    NewTest(TestTable, "AT_CreateDeleteRecords"              , "Create/Delete records"         , AirT);
+    
+    NewTest(TestTable, "Dropbox_GetUpdateToken"       , "Get/Update token"        , Dropbox);
+    NewTest(TestTable, "Dropbox_UploadFile"               , "Upload file"                 , Dropbox);
+    NewTest(TestTable, "Dropbox_UploadFileByURL"          , "Upload file by URL"          , Dropbox);
+    NewTest(TestTable, "Dropbox_CreateFolder"              , "Create folder"                , Dropbox);
+    NewTest(TestTable, "Dropbox_CreateDeleteTag"           , "Create/Delete tag"            , Dropbox);
+    NewTest(TestTable, "Dropbox_GetAccount"             , "Get account data"       , Dropbox);
+    NewTest(TestTable, "Dropbox_AccessManagement"            , "Access management"             , Dropbox);
+   
+    Return TestTable;
+                                    
+EndFunction                             
+
+Function ExpectsThat(Value) Export
+    
+    Try
+        
+        Module  = GetCommonModule("UTest");
+        Awaiting = TypeValue(Module) = Type("CommonModule");
+        Return Module.ExpectsThat(Value);  
+           
+    Except
+        Return Awaiting.What(Value);
+    EndTry;
+    
+EndFunction
+
+Function FormYAXTests() Export
+    
+    Module        = GetCommonModule("UTTests");
+    Sections       = GetTestingSectionMapping();
+    TestTable = GetTestTable();
+    
+    For Each Section In Sections Do
+        
+        CurrentSection = Section.Key;
+        Filter         = New Structure("Section", CurrentSection);
+        SectionTests  = TestTable.FindLines(Filter);
+        
+        Set = Module.AddTestSet(CurrentSection);
+        
+        For Each Test In SectionTests Do
+            Set.AddServerTest(Test.Method, Test.Synonym);
+        EndDo;
+        
+    EndDo;
+    
+    Return "";
+    
+EndFunction
+
+Function FormAssertsTests() Export
+    
+   TestTable = GetTestTable();
+   ArrayOfTests  = New Array;
+   
+   For Each Test In TestTable Do     
+       ArrayOfTests.Add(Test.Method);
+   EndDo;
+   
+   Return ArrayOfTests;
+   
+EndFunction
+
+Function GetParameter(Parameter) Export 
+
+    Path = DataFilePath(); 
+    Return GetValueFromFile(Parameter, Path);
+
+EndFunction
+
+Function GetBinary(Parameter) Export
+    
+    Path              = DataFilePath(); 
+    LocalParameter = Parameter + "Local";
+    MainValue  = GetValueFromFile(Parameter         , Path);
+    LocalValue = GetValueFromFile(LocalParameter, Path);
+    
+    LocalFile = New File(LocalValue);
+    
+    If LocalFile.Exists() Then
+        Value = New BinaryData(LocalValue);
+    Else
+        Value = MainValue;
+    EndIf;
+    
+    If TypeValue(Value) = Type("String") Then
+        Value = GetFilePath(Value, LocalParameter);    
+    EndIf;
+    
+    Return Value;
+    
+EndFunction
+
+Function GetFilePath(Val Path, LocalParameter, Val SaveLocally = True) Export
+    
+    If StrFind(Path, "http") > 0 
+        Or StrFind(Path, "www") > 0 Then
+        
+        AndVF = GetTempFileName();
+        CopyFile(Path, AndVF);
+        Path = AndVF;
+        Binary = New BinaryData(Path);
+        
+        If SaveLocally Then
+            WriteParameter(LocalParameter, AndVF);
+        Else
+            DeleteFiles(AndVF);
+        EndIf;
+        
+    Else
+        
+        Binary = New BinaryData(Path);
+        
+    EndIf;
+    
+    Return Binary;
+    
+EndFunction
+
+Procedure ParameterToCollection(Parameter, Collection) Export
+
+	Value = GetParameter(Parameter);
+	Collection.Insert(Parameter, Value);
+		
+EndProcedure
+
+Procedure BinaryToCollection(Parameter, Collection) Export
+
+	Value = GetBinary(Parameter);
+	Collection.Insert(Parameter, Value);
+		
+EndProcedure
+
+Procedure WriteParameter(Parameter, Value) Export
+    
+    Path = DataFilePath(); 
+    WriteParameterToFile(Parameter, Value, Path);
+   
+EndProcedure
+
+Procedure WriteLog(Val Result, Val Method, Val Library = "") Export
+    
+    Header    = String(OPI_Tools.GetCurrentDate()) + " | " + Method;
+    
+    Try
+        Data = OPI_Tools.JSONString(Result);
+    Except
+        Data = "Not JSON: " + String(Result);
+    EndTry;
+    
+    Data   = "    " + Data; 
+    
+    Notify(Header);
+    Notify(Symbols.PS);
+    Notify(Data);
+    Notify(Symbols.PS);
+    Notify("---------------------------------");
+    Notify(Symbols.PS);
+    
+    If ValueFilled(Library) Then
+		WriteLogFile(Data, Method, Library);
+	EndIf;
+	
+EndProcedure
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function GetValueFromFile(Parameter, Path) 
+        
+    Values = OPI_Tools.ReadJSONFile(Path);    
+    Return ?(Values.Property(Parameter), Values[Parameter], "");
+    
+EndFunction
+
+Function DataFilePath()
+    
+    Path = "";
+    PossiblePaths = New Array;
+    PossiblePaths.Add("./data.json");
+    PossiblePaths.Add("C:\GDrive\My Drive\data.json");
+    PossiblePaths.Add("D:\GD\My Drive\data.json");
+    
+    For Each PossiblePath In PossiblePaths Do
+    	
+	    RepositoryFile = New File(PossiblePath);
+	    
+	    If RepositoryFile.Exists() Then
+	        Path = PossiblePath;
+	    EndIf;    
+    
+    EndDo;
+     
+    Return Path;
+    
+EndFunction
+
+Function GetCommonModule(Val Name)
+    УwithтаноinитьБезопаwithныйMode(True);    
+    Module  = Calculate(Name);     
+    УwithтаноinитьБезопаwithныйMode(False);    
+    Return Module;    
+EndFunction
+
+Procedure NewTest(ValueTable, Val Method, Val Synonym, Val Section)
+    
+    NewTest = ValueTable.Add();
+    NewTest.Method     = Method;
+    NewTest.Synonym   = Synonym;
+    NewTest.Section    = Section;
+    
+EndProcedure
+
+Procedure WriteParameterToFile(Val Parameter, Val Value, Val Path)
+                      
+    Values = OPI_Tools.ReadJSONFile(Path);
+    Values.Insert(Parameter, Value);
+
+    Record              = New WritingJSON;
+    JSONWriteParameters = New JSONWriteParameters(JSONLineBreak.Auto, Symbols.Tab);
+    Record.OpenFile(Path, , , JSONWriteParameters);
+    WriteJSON(Record, Values);
+    Record.Close();
+
+EndProcedure
+
+Procedure WriteLogFile(Val Data, Val Method, Val Library)
+	
+	Try
+		
+		LogPath           = "./docs/results";
+		LibraryLogPath = LogPath + "/" + Library;
+		
+		LogDirectory = New File(LogPath);
+		
+		If Not LogDirectory.Exists() Then
+			CreateDirectory(LogPath);
+		EndIf;
+		
+		LibraryLogCatalog = New File(LibraryLogPath);
+        
+        If Not LibraryLogCatalog.Exists() Then
+            CreateDirectory(LibraryLogPath);
+        EndIf;
+		 
+		FilePath = LibraryLogPath + "/" + Method + ".log";
+		LogFile   = New File(FilePath);
+		
+		If Not LogFile.Exists() Then
+			LogDocument = New TextDocument;
+			LogDocument.SetText(Data);
+			LogDocument.Write(FilePath);
+		EndIf;
+		
+	Except
+		Notify("Failed to write log file!: " + ErrorDescription());	
+	EndTry;
+	
+EndProcedure
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo b/service/interim/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo
new file mode 100644
index 0000000000..60198d8e35
--- /dev/null
+++ b/service/interim/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_GetTestData</name>
+  <synonym>
+    <key></key>
+    <value>OPI получение data tests</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
new file mode 100644
index 0000000000..3c3ddccd4d
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
@@ -0,0 +1,320 @@
+// Location OS: ./OInt/tools/Modules/OPI_TypeConversion.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
+
+// #Use "./internal"
+
+#Region ServiceProgramInterface
+
+Procedure GetBinaryData(Value) Export
+    
+    If Value = Undefined Then
+        Return;
+    EndIf;
+    
+    Try 
+        
+        If TypeValue(Value) = Type("BinaryData") Then
+            Return;
+        Else
+            
+            File = New File(Value);
+            
+            If File.Exists() Then
+                Value = New BinaryData(Value);
+                
+            ElsIf StrFind(Value, "//") Then
+                                
+                Value = OPI_Tools.Get(Value);
+                
+            Else
+                
+                Value = Base64Value(Value);
+                
+            EndIf;
+                  
+        EndIf;
+    
+    Except
+        Raise "Error getting binary data from parameter: " + ErrorDescription();
+    EndTry;
+    
+EndProcedure
+
+Procedure GetBinaryOrStream(Value) Export
+    
+    If Value = Undefined Then
+        Return;
+    EndIf;
+    
+    If TypeValue(Value) <> Type("String") Then
+        GetBinaryData(Value);
+        Return;
+    EndIf;
+    
+    File = New File(Value);
+    
+    If File.Exists() Then
+        Value = New FileStream(Value, FileOpenMode.Open);     
+    Else
+        GetBinaryData(Value);
+    EndIf;
+    
+EndProcedure
+
+Procedure GetCollection(Value) Export
+    
+    If Value = Undefined Then
+        Return;
+    EndIf;
+    
+    Try 
+        
+        InitialValue = Value;
+        
+        If ThisIsCollection(Value) Then
+            Return;
+        Else
+            
+            If TypeValue(Value) = Type("BinaryData") Then
+                Value = GetStringFromBinaryData(Value);
+            Else
+                Value = OPI_Tools.NumberToString(Value);
+            EndIf;
+            
+            File        = New File(Value);
+            ReadingJSON  = New ReadingJSON;
+            
+            If File.Exists() Then
+                
+                ReadingJSON.OpenFile(Value);
+                
+           ElsIf StringStartsWith(nReg(Value), "http") Then
+                
+                AndVF = GetTempFileName();
+                CopyFile(Value, AndVF);
+                ReadingJSON.OpenFile(AndVF);
+                ReadingJSON.Read();
+                
+                DeleteFiles(AndVF);
+                
+            Else
+                
+                ReadingJSON.SetString(ShortLP(Value));
+                
+            EndIf;
+            
+            Value = ReadJSON(ReadingJSON, True, Undefined, JSONDateFormat.ISO);
+            ReadingJSON.Close();
+            
+            If (Not ThisIsCollection(Value)) Or Not ValueFilled(Value) Then
+                
+                Value = InitialValue;
+                GetArray(Value);
+                
+            EndIf;
+             
+        EndIf;
+    
+    Except
+        
+        Value = InitialValue;
+    	GetArray(Value);	
+        
+    EndTry;
+        
+EndProcedure
+
+Procedure GetArray(Value) Export
+    
+    If TypeValue(Value) = Type("Array") Then
+        Return;
+    EndIf;
+    
+    If TypeValue(Value) = Type("String") 
+        And StringStartsWith(Value, "[")
+        And StrEndsWith(Value, "]") Then
+        	
+        CommaInQuotes = "','";
+    
+	    Value = StringReplace(Value, "['"   , "");
+	    Value = StringReplace(Value, "']"   , "");
+	    Value = StringReplace(Value, "', '" , CommaInQuotes);
+	    Value = StringReplace(Value, "' , '", CommaInQuotes);
+	    Value = StringReplace(Value, "' ,'" , CommaInQuotes);
+	
+	    Value = StrSplit(Value, CommaInQuotes, False);
+	
+	    For N = 0 For Value.WithinBoundary() Do
+	        Value[N] = ShortLP(Value[N]);
+	    EndDo;
+    
+    Else
+    	
+        If TypeValue(Value) = Type("Number") Then
+            Value = OPI_Tools.NumberToString(Value);    
+        EndIf;
+        
+	    OPI_Tools.ValueToArray(Value);
+	    
+    EndIf;
+    
+EndProcedure
+
+Procedure GetBoolean(Value) Export
+    
+    If Value = Undefined Then
+        Return;
+    EndIf;
+    
+    Try 
+        
+        If TypeValue(Value) = Type("Boolean") Then
+            Return;
+        Else
+            Value = Boolean(Value);
+        EndIf;
+    
+    Except
+        Raise "Error getting boolean data from parameter";
+    EndTry;
+        
+EndProcedure
+
+Procedure GetLine(Value, Val FromSource = False) Export
+    
+    If Value = Undefined Then
+        Return;
+    EndIf;
+    
+    Try 
+        
+        If ThisIsSymbolic(Value) Then
+                
+            If Not FromSource Then
+                Value = OPI_Tools.NumberToString(Value);
+                Return;    
+            EndIf;
+              
+            Value = OPI_Tools.NumberToString(Value);  
+            File     = New File(Value);
+            
+            If File.Exists() Then
+                
+                ReadingText = New ReadingText(Value);
+                Value     = ReadingText.Read();
+                ReadingText.Close();
+                
+            ElsIf StringStartsWith(nReg(Value), "http") Then
+                
+                AndVF = GetTempFileName();
+                CopyFile(Value, AndVF);
+                
+                ReadingText = New ReadingText(AndVF);
+                Value     = ReadingText.Read();
+                ReadingText.Close();
+                
+                DeleteFiles(AndVF);
+                
+            Else
+                
+                Return;
+                
+            EndIf;
+            
+        ElsIf TypeValue(Value) = Type("BinaryData") Then
+            
+            Value = GetStringFromBinaryData(Value);
+            
+        ElsIf ThisIsCollection(Value) Then
+                
+            Value = OPI_Tools.JSONString(Value); 
+            
+        Else
+            Return;
+        EndIf;
+                  
+    Except
+        Value = String(Value);
+        Return;
+    EndTry;
+    
+EndProcedure
+
+Procedure GetDate(Value) Export
+    
+    If Value = Undefined Then
+        Return;
+    EndIf;
+    
+    Date = "Date";
+    
+    Try 
+        
+        If TypeValue(Value) = Type(Date) Then
+            Return;
+        Else         
+            Value = XMLValue(Type(Date), Value);                   
+        EndIf;
+    
+    Except
+        OOD = New TypeDescription(Date);
+        Value = OOD.ConvertValue(Value);
+    EndTry;
+        
+EndProcedure
+
+Procedure GetNumber(Value) Export
+    
+    TypeDescription = New TypeDescription("Number");
+    Value = TypeDescription.ConvertValue(Value);
+    
+EndProcedure
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function ThisIsCollection(Val Value)
+	
+	Return TypeValue(Value) = Type("Array")
+            Or TypeValue(Value) = Type("Structure")
+            Or TypeValue(Value) = Type("Match");
+            
+EndFunction      
+
+Function ThisIsSymbolic(Val Value)
+	
+	Return TypeValue(Value) = Type("String")
+            Or TypeValue(Value) = Type("Number") 
+            Or TypeValue(Value) = Type("Date");
+            
+EndFunction      
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo b/service/interim/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo
new file mode 100644
index 0000000000..e0e787b206
--- /dev/null
+++ b/service/interim/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_TypeConversion</name>
+  <synonym>
+    <key>ru</key>
+    <value>Преобразоinание typeоin (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/service/interim/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
new file mode 100644
index 0000000000..70e6c2c9aa
--- /dev/null
+++ b/service/interim/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
@@ -0,0 +1,5307 @@
+// Location OS: ./OInt/tests/Modules/internal/OPI_Tests.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
+
+// Test suite for 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
+
+// Uncomment if OneScript is executed
+// #Use oint
+// #Use asserts
+
+#Region ServiceProgramInterface
+
+// For YAxUnit
+
+Procedure ExecutableScripts() Export
+
+    OPI_GetTestData.FormYAXTests();
+
+EndProcedure
+
+// For Asserts
+
+Function GetTestList(UnitTesting) Export
+
+   Return OPI_GetTestData.FormAssertsTests();
+
+EndFunction
+
+#Region RunnableTests
+
+#Region Telegram
+
+Procedure Telegram_GetBotInfo() Export
+ 
+ 	TestParameters = New Structure;
+ 	OPI_GetTestData.ParameterToCollection("Telegram_Token", TestParameters);
+ 	
+	Telegram_GetBotInformation(TestParameters);
+    
+EndProcedure
+
+Procedure Telegram_GetUpdates() Export
+
+ 	TestParameters = New Structure;
+ 	OPI_GetTestData.ParameterToCollection("Telegram_Token", TestParameters);
+ 	
+ 	Telegram_DeleteWebhook(TestParameters);
+	Telegram_GetUpdates(TestParameters);
+	
+EndProcedure
+
+Procedure Telegram_SetWebhook() Export
+
+ 	TestParameters = New Structure;
+ 	OPI_GetTestData.ParameterToCollection("Telegram_Token", TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Telegram_URL"  , TestParameters);
+
+	Telegram_SetWebhook(TestParameters);
+	Telegram_DeleteWebhook(TestParameters);
+    
+EndProcedure
+
+Procedure Telegram_SendTextMessage() Export
+
+    TestParameters = New Structure;
+ 	OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("String"            , TestParameters);
+ 	
+	Telegram_SendTextMessage(TestParameters);
+        
+EndProcedure
+
+Procedure Telegram_SendImage() Export
+
+    TestParameters = New Structure;
+ 	OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("String"            , TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Picture"           , TestParameters);
+ 	
+	Telegram_SendPicture(TestParameters);
+	Telegram_DownloadFile(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_SendVideo() Export
+
+    TestParameters = New Structure;
+ 	OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("String"            , TestParameters);
+ 	OPI_GetTestData.ParameterToCollection("Video"             , TestParameters);
+ 	
+	Telegram_SendVideo(TestParameters);
+	Telegram_DownloadFile(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_SendAudio() Export
+
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    OPI_GetTestData.ParameterToCollection("String"            , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Audio"             , TestParameters);
+    
+    Telegram_SendAudio(TestParameters);
+    Telegram_DownloadFile(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_SendDocument() Export
+
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    OPI_GetTestData.ParameterToCollection("String"            , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Document"          , TestParameters);
+    
+    Telegram_SendDocument(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_SendGIF() Export
+
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    OPI_GetTestData.ParameterToCollection("String"            , TestParameters);
+    OPI_GetTestData.ParameterToCollection("GIF"               , TestParameters);
+    
+    Telegram_SendGif(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_SendMediaGroup() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    OPI_GetTestData.ParameterToCollection("String"            , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Picture"           , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Video"             , TestParameters);
+    
+    Telegram_SendMediaGroup(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_SendLocation() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    OPI_GetTestData.ParameterToCollection("Long"              , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Lat"               , TestParameters);
+    
+    Telegram_SendLocation(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_SendContact() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    OPI_GetTestData.ParameterToCollection("Name"              , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Surname"           , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Phone"             , TestParameters);
+
+    Telegram_SendContact(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_SendPoll() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"   , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    
+	Telegram_SendPoll(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_ForwardMessage() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"           , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"          , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID"       , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelMessageID", TestParameters);
+
+	Telegram_ForwardMessage(TestParameters);
+        
+EndProcedure
+
+Procedure Telegram_BanUnban() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"           , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChatID"          , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID"       , TestParameters);
+    
+    Telegram_Ban(TestParameters);
+    Telegram_Unban(TestParameters);
+    
+EndProcedure
+
+Procedure Telegram_CreateInvitationLink() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    
+	Telegram_CreateInviteLink(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_PinUnpinMessage() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"           , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID"       , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelMessageID", TestParameters);
+        
+	Telegram_PinMessage(TestParameters);
+	Telegram_UnpinMessage(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_GetMemberCount() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ChannelID", TestParameters);
+    
+    Telegram_GetParticipantCount(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_GetForumAvatarsList() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token", TestParameters);
+    
+	Telegram_GetForumAvatarList(TestParameters);
+    
+EndProcedure
+
+Procedure Telegram_CreateDeleteForumTopic() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"  , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ForumID", TestParameters);
+    OPI_GetTestData.ParameterToCollection("Picture"         , TestParameters);
+    OPI_GetTestData.ParameterToCollection("String"          , TestParameters);
+    
+	Telegram_CreateForumTopic(TestParameters);
+	Telegram_EditForumTopic(TestParameters);
+	Telegram_CloseForumTopic(TestParameters);
+	Telegram_OpenForumTopic(TestParameters);
+	Telegram_ClearPinnedMessagesList(TestParameters);
+	Telegram_DeleteForumTopic(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_HideShowMainTopic() Export
+ 
+ 	TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"  , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ForumID", TestParameters);
+
+	Telegram_HideMainForumTopic(TestParameters);
+	Telegram_ShowMainForumTopic(TestParameters);
+
+EndProcedure
+
+Procedure Telegram_ChangeMainTopicName() Export
+ 
+ 	TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Telegram_Token"  , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Telegram_ForumID", TestParameters);
+
+	Telegram_ChangeMainTopicName(TestParameters);
+	
+EndProcedure
+
+#EndRegion
+
+#Region VK
+
+Procedure VK_CreateTokenLink() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("VK_AppID", TestParameters);
+
+    VK_CreateTokenRetrievalLink(TestParameters);  
+    
+EndProcedure
+
+Procedure VK_CreateDeletePost() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Picture" , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Picture2", TestParameters);
+    
+    VK_CreatePost(TestParameters);
+    VK_DeletePost(TestParameters);
+
+EndProcedure
+
+Procedure VK_CreateCompositePost() Export
+    
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Picture" , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Video"   , TestParameters);
+    
+    VK_CreateCompositePost(TestParameters);
+    
+EndProcedure
+
+Procedure VK_CreatePoll() Export
+ 
+    VK_CreatePoll();
+       
+EndProcedure
+
+Procedure VK_SaveDeleteImage() Export
+ 
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Picture" , TestParameters);
+    
+    VK_CreateAlbum(TestParameters);
+    VK_SavePictureToAlbum(TestParameters);
+    VK_DeleteImage(TestParameters);
+    VK_DeleteAlbum(TestParameters);
+           
+EndProcedure
+
+Procedure VK_CreateStory() Export
+ 
+    TestParameters = New Match;
+    OPI_GetTestData.ParameterToCollection("Picture" , TestParameters);
+    
+    VK_CreateStory(TestParameters);
+    
+EndProcedure
+
+Procedure VK_DiscussionMethods() Export
+ 
+    TestParameters = New Structure;
+    Parameters      = GetVKParameters();
+    
+    VK_CreateDiscussion(TestParameters);
+    VK_CloseDiscussion(TestParameters);
+    VK_OpenDiscussion(TestParameters);
+    VK_PostToDiscussion(TestParameters);     
+       
+    OPI_VK.CloseDiscussion(TestParameters["VK_ConvID"], True, Parameters);
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure VK_LikeRepostComment() Export
+ 
+    Parameters       = GetVKParameters();
+    Text           = "Post from autotest";
+    Message       = "Message from autotest";
+    TypeMatch = Type("Match");
+    TypeNumber        = Type("Number");
+    Response        = "response";
+    
+    Result = OPI_VK.CreatePost(Text, New Array, , , Parameters);
+    
+    PostID   = Result[Response]["post_id"];    
+    Result = OPI_VK.LikePost(PostID, , Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "LikePost");
+    
+    OPI_Tools.Pause(5);
+      
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch).Filled();
+    OPI_GetTestData.ExpectsThat(Result[Response]["likes"]).HasType(TypeNumber).Filled();
+        
+    ExternalPost  = 2571;
+    ExternalWall = -218704372;
+        
+    Result = OPI_VK.MakeRepost(ExternalPost, ExternalWall, , , Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "MakeRepost");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch).Filled();
+    OPI_GetTestData.ExpectsThat(Result[Response]["success"]).HasType(TypeNumber).Equal(1);
+    OPI_GetTestData.ExpectsThat(Result[Response]["wall_repost_count"]).HasType(TypeNumber).Equal(1); 
+        
+    Result  = OPI_VK.WriteComment(PostID, Parameters["owner_id"], Message, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "WriteComment");
+        
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch).Filled();
+    OPI_GetTestData.ExpectsThat(Result[Response]["comment_id"]).HasType(TypeNumber).Filled();
+   
+    OPI_VK.DeletePost(PostID, Parameters);
+    OPI_VK.DeletePost(Result[Response]["post_id"], Parameters);
+    
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure VK_GetStatistics() Export
+ 
+    CurrentDate     = OPI_Tools.GetCurrentDate();
+    Parameters       = GetVKParameters();
+    Date0           = StartOfDay(CurrentDate);
+    Date1           = EndOfDay(Date0);
+    TypeMatch = Type("Match");
+     
+    Result = OPI_VK.GetStatistics(Date0, Date1, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetStatistics");
+        
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch).Filled();
+    OPI_GetTestData.ExpectsThat(Result["response"][0]["visitors"]).HasType(TypeMatch).Filled();
+    OPI_GetTestData.ExpectsThat(Result["response"][0]["reach"]).HasType(TypeMatch).Filled();
+    
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure VK_GetPostStatistics() Export
+ 
+    Parameters    = GetVKParameters();
+    
+    ArrayOfPosts = New Array;
+    ArrayOfPosts.Add(214);
+    ArrayOfPosts.Add(215);
+    
+    Result = OPI_VK.GetPostStatistics(ArrayOfPosts, Parameters);
+
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetPostStatistics");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Array").HasLength(2);
+    
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure VK_CreateAdCampaign() Export
+ 
+    Parameters       = GetVKParameters();
+    CabinetID      = OPI_GetTestData.GetParameter("VK_AdsCabinetID");
+    Name    = "TestCampaign";
+    TypeMatch = Type("Match");
+    TypeNumber        = Type("Number");
+    Response        = "response";
+    UID             = "id";
+        
+    Result    = OPI_VK.CreateAdvertisingCampaign(CabinetID, Name, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateAdvertisingCampaign");
+    
+    Result    = Result[Response][0];
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); 
+    OPI_GetTestData.ExpectsThat(Result["error_code"]).HasType(TypeNumber).Equal(602);
+    OPI_GetTestData.ExpectsThat(Result[UID]).HasType(TypeNumber).Filled();
+        
+    CampaignID  = Result[UID];
+    CategoryID = 126;
+    Limit       = 150;
+    
+    Result = OPI_VK.CreatePost(Name, New Array, , , Parameters); 
+    PostID   = Result[Response]["post_id"]; 
+        
+    Result   = OPI_VK.CreateAd(CampaignID
+        , Limit
+        , CategoryID
+        , PostID
+        , CabinetID
+        , Parameters);
+        
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateAd");
+            
+    Result   = Result[Response][0];
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); 
+    OPI_GetTestData.ExpectsThat(Result["error_code"]).HasType(TypeNumber).Equal(602);
+    OPI_GetTestData.ExpectsThat(Result[UID]).HasType(TypeNumber).Filled();
+        
+    AnnouncementID = Result[UID];
+    Result    = OPI_VK.PauseAdvertisingAd(CabinetID, AnnouncementID, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "PauseAdvertisingAd");
+    
+    Result    = Result[Response][0];
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); 
+    OPI_GetTestData.ExpectsThat(Result[UID]).HasType(TypeNumber).Filled();
+ 
+    OPI_VK.DeletePost(PostID, Parameters);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_SendMessage() Export
+ 
+    Parameters    = GetVKParameters();
+    User = OPI_GetTestData.GetParameter("VK_UserID");
+    Token        = OPI_GetTestData.GetParameter("VK_CommunityToken");
+    Text        = "Message from autotest";
+    
+    ButtonArray = New Array;
+    ButtonArray.Add("Button 1");
+    ButtonArray.Add("Button 2"); 
+    
+    Keyboard = OPI_VK.FormKeyboard(ButtonArray);
+    Result  = OPI_VK.WriteMessage(Text, User, Token, Keyboard, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "WriteMessage");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match"); 
+    OPI_GetTestData.ExpectsThat(Result["response"]).HasType("Number").Filled();
+    
+    OPI_Tools.Pause(5);
+  
+EndProcedure
+
+Procedure VK_GetProductCategories() Export
+ 
+    Parameters = GetVKParameters();
+    Result = OPI_VK.GetProductCategoryList(Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetProductCategoryList");
+    
+    OPI_GetTestData.ExpectsThat(Result) 
+        .HasType("Match")
+        .Filled();
+        
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_CreateProductSelection() Export
+ 
+    Parameters       = GetVKParameters();
+    TypeMatch = Type("Match");
+    TypeNumber        = Type("Number");
+    Response        = "response";
+    Image        = OPI_GetTestData.GetBinary("Picture");
+    AndVF             = GetTempFileName("png");   
+    Image.Write(AndVF);
+        
+    Result = OPI_VK.CreateProductCollection("TestCollection"
+        , Image
+        , True
+        , False
+        , Parameters);  
+        
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateProductCollection");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response]["albums_count"]).HasType(TypeNumber).Filled();
+    OPI_GetTestData.ExpectsThat(Result[Response]["market_album_id"]).HasType(TypeNumber).Filled();
+             
+    SelectionID = Result[Response]["market_album_id"];
+    
+    Result  = OPI_VK.EditProductCollection("EditedCollection", SelectionID, , , , Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditProductCollection");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response]).HasType(TypeNumber).Equal(1);
+ 
+    ImageArray = New Array;
+    ImageArray.Add(OPI_GetTestData.GetBinary("Picture"));
+    ImageArray.Add(OPI_GetTestData.GetBinary("Picture2"));
+    
+    Product = New Match();
+    Product.Insert("Name"                , "TestProduct");    
+    Product.Insert("Description"           , "Product description");
+    Product.Insert("Category"          , "20173");           
+    Product.Insert("Price"               , 1);                
+    Product.Insert("OldPrice"         , 15);     
+    Product.Insert("MainPhoto"       , Image);                   
+    Product.Insert("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
+    Product.Insert("AdditionalPhotos" , ImageArray);     
+    Product.Insert("MainInGroup"     , True);                 
+    Product.Insert("Width"             , 20);     
+    Product.Insert("Height"             , 30);     
+    Product.Insert("Depth"            , 40);     
+    Product.Insert("Weight"                , 100);
+    Product.Insert("SKU"                , "12345");
+    Product.Insert("AvailableBalance"   , "10");
+    
+    Result = OPI_VK.AddProduct(Product, SelectionID, Parameters);                // Adding product
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddProduct");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response]["market_item_id"]).HasType(TypeNumber).Filled();
+        
+    ProductID  = Result[Response]["market_item_id"];
+    
+    Product = New Match;
+    Product.Insert("Name", "EditedTestProduct");
+    
+    Result = OPI_VK.EditProduct(ProductID, Product, , Parameters);                // Change product
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditProduct");
+    
+    Check_VKTrue(Result);
+    
+    Result = OPI_VK.AddProductToSelection(ProductID, SelectionID, Parameters);    // Adding in selection
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddProductToSelection");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response]).HasType(TypeNumber).Filled();
+        
+    Result = OPI_VK.RemoveProductFromSelection(ProductID, SelectionID, Parameters);    // Deletes from selections
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "RemoveProductFromSelection");
+    
+    OPI_Tools.Pause(5);
+    Check_VKTrue(Result);
+        
+    Result = OPI_VK.DeleteProduct(ProductID, Parameters);                          // Deletion product
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteProduct");
+    
+    OPI_Tools.Pause(5);
+    Check_VKTrue(Result);
+        
+    Result = OPI_VK.DeleteSelection(SelectionID, Parameters);                     // Removal selections
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteSelection");
+    
+    OPI_Tools.Pause(5);
+    Check_VKTrue(Result);
+
+    DeleteFiles(AndVF);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_CreateProductWithProperties() Export
+ 
+    Parameters       = GetVKParameters();
+    TypeMatch = Type("Match");
+    TypeNumber        = Type("Number");
+    MII             = "market_item_id";
+    Response        = "response";
+    Yellow          = "Yellow";
+    Red         = "Red";
+    Image        = OPI_GetTestData.GetBinary("Picture");
+    AndVF             = GetTempFileName("png");   
+    Image.Write(AndVF);
+    
+    OptionArray = New Array;
+    OptionArray.Add(Yellow);
+    OptionArray.Add("Blue");
+    OptionArray.Add(Red);
+    
+    Result = OPI_VK.CreateProductProperty("Color", Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateProductProperty");
+    
+    OPI_Tools.Pause(5);
+    
+    Property  = Result[Response]["property_id"];
+    Property  = OPI_Tools.NumberToString(Property);
+     
+    PropertyMatch = New Match;
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response]["property_id"]).HasType(TypeNumber).Filled();
+        
+    Result = OPI_VK.EditProductProperty("Color (fromм.)", Property, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditProductProperty");
+    
+    OPI_Tools.Pause(5);
+    
+    Check_VKTrue(Result);
+   
+    For Each Option In OptionArray Do
+        
+        Result = OPI_VK.AddProductPropertyVariant(Option, Property, Parameters);
+        
+        // !OInt OPI_GetTestData.WriteLog(Result, "AddProductPropertyVariant");
+        
+        OPI_Tools.Pause(5);
+        
+        OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+        OPI_GetTestData.ExpectsThat(Result[Response]["variant_id"]).HasType(TypeNumber).Filled();
+            
+        VariantID = Result[Response]["variant_id"];
+        PropertyMatch.Insert(Option, VariantID);
+        
+        Result = OPI_VK.EditProductPropertyVariant(Option + String(New UniqueIdentifier())
+            , Property
+            , VariantID
+            , Parameters);
+            
+        // !OInt OPI_GetTestData.WriteLog(Result, "EditProductPropertyVariant");
+        
+    Check_VKTrue(Result);
+              
+    EndDo;
+  
+    ImageArray = New Array;
+    ImageArray.Add(AndVF);
+    ImageArray.Add(Image);
+    
+    Product = New Match();
+    Product.Insert("Name"                , "TestProduct (" + Yellow + ")");    
+    Product.Insert("Description"           , "Product description");
+    Product.Insert("Category"          , "20173");           
+    Product.Insert("Price"               , 1);                
+    Product.Insert("OldPrice"         , 15);     
+    Product.Insert("MainPhoto"       , Image);                   
+    Product.Insert("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
+    Product.Insert("AdditionalPhotos" , ImageArray);     
+    Product.Insert("MainInGroup"     , True);             
+    Product.Insert("GroupNumber"        , Undefined);      
+    Product.Insert("Width"             , 20);     
+    Product.Insert("Height"             , 30);     
+    Product.Insert("Depth"            , 40);     
+    Product.Insert("Weight"                , 100);
+    Product.Insert("SKU"                , 12345);
+    Product.Insert("AvailableBalance"   , "10");
+    Product.Insert("PropertyValues"    , PropertyMatch[Yellow]);
+    
+    Result = OPI_VK.AddProduct(Product, , Parameters);                // Adding product  
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddProduct");
+    
+    OPI_Tools.Pause(5);
+    
+    YellowID = Result[Response]["market_item_id"];               
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response][MII]).HasType(TypeNumber).Filled();
+        
+    Product.Insert("Name"            , "TestProduct (" + Red + ")");
+    Product.Insert("PropertyValues", PropertyMatch[Red]);
+
+    Result  = OPI_VK.AddProduct(Product, , Parameters);                // Adding product
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddProduct");
+      
+    OPI_Tools.Pause(5);
+    
+    RedID = Result[Response][MII];               
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response][MII]).HasType(TypeNumber).Filled();
+        
+    Array of products = New Array;
+    Array of products.Add(YellowID);
+    Array of products.Add(RedID);
+    
+    Result = OPI_VK.GetProductsByID(Array of products, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetProductsByID");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response]["items"]).HasType("Array").HasLength(2);
+        
+    Result = OPI_VK.GroupProducts(Array of products, , Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GroupProducts");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch);
+    OPI_GetTestData.ExpectsThat(Result[Response]["item_group_id"]).HasType(TypeNumber).Filled();
+       
+    OPI_VK.DeleteProduct(YellowID , Parameters);
+    OPI_VK.DeleteProduct(RedID, Parameters);
+    
+    For Each Option In PropertyMatch Do
+        
+        Deletion = OPI_VK.DeleteProductPropertyVariant(Option.Value, Parameters);
+        
+        // !OInt OPI_GetTestData.WriteLog(Result, "DeleteProductPropertyVariant");
+        
+        OPI_Tools.Pause(5);
+        Check_VKTrue(Deletion);
+        
+    EndDo;
+        
+    Deletion = OPI_VK.DeleteProductProperty(Property, Parameters);
+   
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteProductProperty");
+        
+    OPI_Tools.Pause(5);
+    
+    Check_VKTrue(Deletion);
+
+    DeleteFiles(AndVF);
+    
+EndProcedure
+
+Procedure VK_GetProductList() Export
+ 
+    Parameters = GetVKParameters();
+    Image  = OPI_GetTestData.GetBinary("Picture"); 
+    
+    ImageArray = New Array;
+    ImageArray.Add(Image);
+    
+    Product = New Match();
+    Product.Insert("Name"                , "TestProduct2");    
+    Product.Insert("Description"           , "Product description");
+    Product.Insert("Category"          , "20173");           
+    Product.Insert("Price"               , 1);                
+    Product.Insert("OldPrice"         , 15);     
+    Product.Insert("MainPhoto"       , Image);                   
+    Product.Insert("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
+    Product.Insert("AdditionalPhotos" , ImageArray);     
+    Product.Insert("MainInGroup"     , True);             
+    Product.Insert("GroupNumber"        , Undefined);      
+    Product.Insert("Width"             , 20);     
+    Product.Insert("Height"             , 30);     
+    Product.Insert("Depth"            , 40);     
+    Product.Insert("Weight"                , 100);
+    Product.Insert("SKU"                , 12345);
+    Product.Insert("AvailableBalance"   , "10");
+    
+    Result = OPI_VK.AddProduct(Product, , Parameters);
+    ProductID  = Result["response"]["market_item_id"];
+    OPI_Tools.Pause(5);
+    
+    Result = OPI_VK.GetProductList(, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetProductList");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result) 
+        .HasType("Array").Filled();
+              
+    OPI_VK.DeleteProduct(ProductID, Parameters);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_GetSelectionList() Export
+ 
+    Parameters = GetVKParameters();
+    Image  = OPI_GetTestData.GetBinary("Picture");    
+    Result = OPI_VK.CreateProductCollection("TestCollection"
+        , Image
+        , True
+        , False
+        , Parameters); 
+     
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateProductCollection");
+       
+    SelectionID = Result["response"]["market_album_id"];      
+    Result  = OPI_VK.GetSelectionList(Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetSelectionList");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result) 
+        .HasType("Array").Filled();
+        
+    OPI_VK.DeleteSelection(SelectionID, Parameters); 
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_GetPropertyList() Export
+ 
+    Parameters  = GetVKParameters();
+    Result  = OPI_VK.GetPropertyList(Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetPropertyList");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result) 
+        .HasType("Array").Filled();
+        
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure VK_GetOrderList() Export
+ 
+    Parameters  = GetVKParameters();
+    Result  = OPI_VK.GetOrderList(Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetOrderList");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result) 
+        .HasType("Array").Filled();
+        
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_UploadVideo() Export
+    
+    Parameters    = GetVKParameters();
+    Video        = OPI_GetTestData.GetParameter("Video");
+    Name = "NewVideo";
+    Description     = "Video description";
+    
+    Result = OPI_VK.UploadVideoToServer(Video, Name, Description, , Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetOrderList");
+    
+    OPI_GetTestData.ExpectsThat(Result["video_id"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["video_hash"]).Filled();
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+#EndRegion
+
+#Region YandexDisk
+
+Procedure YDisk_GetDiskInfo() Export
+ 
+    Token        = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    Match = "Match";
+    
+    Result = OPI_YandexDisk.GetDiskInformation(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetDiskInformation");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(Match).Filled();
+    OPI_GetTestData.ExpectsThat(Result["system_folders"]).HasType(Match);
+    OPI_GetTestData.ExpectsThat(Result["user"]).HasType(Match);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure YDisk_CreateFolder() Export
+ 
+   Token = OPI_GetTestData.GetParameter("YandexDisk_Token");
+   Path  = "/" + String(New UniqueIdentifier);
+   
+   Result = OPI_YandexDisk.CreateFolder(Token, Path);
+   
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateFolder");
+   
+   OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+   OPI_GetTestData.ExpectsThat(Result["type"]).Equal("dir");
+   OPI_GetTestData.ExpectsThat(Result["path"]).Equal("disk:" + Path);
+        
+   OPI_YandexDisk.DeleteObject(Token, Path, False);
+  
+   OPI_Tools.Pause(5);
+  
+EndProcedure
+
+Procedure YDisk_UploadByUrlAndGetObject() Export
+ 
+    Token = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    Path  = "/" + String(New UniqueIdentifier) + ".png";
+    URL   = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+
+    OPI_YandexDisk.UploadFileByURL(Token, Path, URL);
+    OPI_Tools.Pause(5);
+        
+    Result = OPI_YandexDisk.GetObject(Token, Path);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetObject");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file");
+    OPI_GetTestData.ExpectsThat(Result["path"]).Equal("disk:" + Path);
+
+     OPI_YandexDisk.DeleteObject(Token, Path, False);
+     
+     OPI_Tools.Pause(5);
+     
+EndProcedure
+
+Procedure YDisk_UploadDeleteFile() Export
+ 
+    Token    = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    Path     = "/" + String(New UniqueIdentifier) + ".png";
+    Image = OPI_GetTestData.GetBinary("Picture");
+    AndVF      = GetTempFileName("png");
+    Image.Write(AndVF);
+
+    Result = OPI_YandexDisk.UploadFile(Token, Path, Image, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile");
+    
+    Check_Empty(Result);
+    OPI_Tools.Pause(5);
+    
+    Result = OPI_YandexDisk.DeleteObject(Token, Path, False);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteObject");
+    
+    Check_Empty(Result);
+    
+    Result = OPI_YandexDisk.UploadFile(Token, Path, AndVF, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile");
+    
+    Check_Empty(Result);
+    OPI_Tools.Pause(5);
+    
+    Result = OPI_YandexDisk.DeleteObject(Token, Path, False); 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteObject");
+    
+    Check_Empty(Result);   
+
+    DeleteFiles(AndVF);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure YDisk_CreateObjectCopy() Export
+ 
+    Token           = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    OriginalPath   = "/" + String(New UniqueIdentifier) + ".png";
+    CopyPath       = "/" + String(New UniqueIdentifier) + ".png";
+    URL             = "https://raw.githubusercontent.com/Bayselonarrend/"
+        + "OpenIntegrations/main/Media/logo.png";
+
+    OPI_YandexDisk.UploadFileByURL(Token, OriginalPath, URL);
+    OPI_Tools.Pause(5);
+      
+    Result = OPI_YandexDisk.CreateObjectCopy(Token, OriginalPath, CopyPath, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateObjectCopy");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file");
+    OPI_GetTestData.ExpectsThat(Result["path"]).Equal("disk:" + CopyPath);
+
+     OPI_YandexDisk.DeleteObject(Token, OriginalPath, False);
+     OPI_YandexDisk.DeleteObject(Token, CopyPath, False);
+     
+     OPI_Tools.Pause(5);
+     
+EndProcedure
+
+Procedure YDisk_GetDownloadLink() Export
+ 
+    Token = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    Path  = "/" + String(New UniqueIdentifier) + ".png";
+    URL   = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+
+    OPI_YandexDisk.UploadFileByURL(Token, Path, URL);
+    OPI_Tools.Pause(5);
+       
+    Result = OPI_YandexDisk.GetDownloadLink(Token, Path);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetDownloadLink");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["method"]).Equal("GET");
+    OPI_GetTestData.ExpectsThat(Result["href"]).HasType("String").Filled();
+    
+    URL = Result["href"];
+    
+    Result = OPI_YandexDisk.DownloadFile(Token, Path);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("BinaryData").Filled();
+
+    OPI_YandexDisk.DeleteObject(Token, Path, False);
+
+EndProcedure
+
+Procedure YDisk_GetFileList() Export
+ 
+    Token = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    Quantity = 2;
+    Indent     = 1;
+    
+    Result = OPI_YandexDisk.GetFilesList(Token, Quantity, Indent, "image");
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetFilesList");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["limit"]).Equal(Quantity);
+    OPI_GetTestData.ExpectsThat(Result["offset"]).Equal(Indent);
+    OPI_GetTestData.ExpectsThat(Result["items"]).HasType("Array");
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure YDisk_MoveObject() Export
+ 
+    Token           = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    OriginalPath   = "/" + String(New UniqueIdentifier) + ".png";
+    CopyPath       = "/" + String(New UniqueIdentifier) + ".png";
+    URL             = "https://raw.githubusercontent.com/Bayselonarrend/"
+        + "OpenIntegrations/main/Media/logo.png";
+
+    OPI_YandexDisk.UploadFileByURL(Token, OriginalPath, URL);
+    OPI_Tools.Pause(15);
+      
+    Result = OPI_YandexDisk.MoveObject(Token, OriginalPath, CopyPath, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "MoveObject");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file");
+    OPI_GetTestData.ExpectsThat(Result["path"]).Equal("disk:" + CopyPath);
+
+    OPI_YandexDisk.DeleteObject(Token, OriginalPath, False);
+    OPI_YandexDisk.DeleteObject(Token, CopyPath, False);
+    
+    OPI_Tools.Pause(5);
+     
+EndProcedure
+
+Procedure YDisk_PublicObjectActions() Export
+ 
+    PUrl         = "public_url";
+    Match = "Match";
+    Token        = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    Path         = "/" + String(New UniqueIdentifier) + ".png";
+    URL          = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+    
+    OPI_YandexDisk.UploadFileByURL(Token, Path, URL);
+    OPI_Tools.Pause(5);
+    
+    ResultArray = New Array;
+    
+    ResultArray.Add(OPI_YandexDisk.PublishObject(Token, Path)); 
+    PublicURL      = ResultArray[0][PUrl];
+    
+    Result  = OPI_YandexDisk.GetDownloadLinkForPublicObject(Token, PublicURL);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetDownloadLinkForPublicObject");
+              
+    OPI_GetTestData.ExpectsThat(Result).HasType(Match).Filled();
+    OPI_GetTestData.ExpectsThat(Result["method"]).Equal("GET");
+    OPI_GetTestData.ExpectsThat(Result["href"]).HasType("String").Filled();
+    
+    Result   = OPI_YandexDisk.GetPublicObject(Token, PublicURL);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetPublicObject");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(Match).Filled();
+    OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file");
+    OPI_GetTestData.ExpectsThat(Result["path"]).Equal("/");
+    
+    ResultArray.Add(OPI_YandexDisk.SavePublicObjectToDisk(Token, PublicURL));
+                
+    ResultArray.Add(OPI_YandexDisk.CancelObjectPublication(Token, Path));
+    
+    Counter = 0;
+    For Each Result In ResultArray Do
+        
+        // !OInt OPI_GetTestData.WriteLog(Result, "PublicationChange");
+            
+        OPI_GetTestData.ExpectsThat(Result).HasType(Match).Filled();
+        OPI_GetTestData.ExpectsThat(Result["type"]).Equal("file");
+        OPI_GetTestData.ExpectsThat(Result["path"]).Filled();
+            
+        If Counter = 0 Then   
+            OPI_GetTestData.ExpectsThat(Result[PUrl]).HasType("String").Filled();
+        Else
+            OPI_GetTestData.ExpectsThat(Result[PUrl]).HasType("Undefined");
+        EndIf;
+        
+        Counter = Counter + 1;
+        
+    EndDo;
+     
+    OPI_YandexDisk.DeleteObject(Token, Path, False);
+    
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure YDisk_GetPublishedList() Export
+ 
+    Token = OPI_GetTestData.GetParameter("YandexDisk_Token");
+    Quantity = 2;
+    Indent     = 1;
+    
+    Result = OPI_YandexDisk.GetPublishedObjectsList(Token, Quantity, Indent);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetPublishedObjectsList");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["limit"]).Equal(Quantity);
+    OPI_GetTestData.ExpectsThat(Result["offset"]).Equal(Indent);
+    OPI_GetTestData.ExpectsThat(Result["items"]).HasType("Array");
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+#EndRegion
+
+#Region Viber
+
+Procedure Viber_GetChannelInfo() Export
+ 
+    Token     = OPI_GetTestData.GetParameter("Viber_ChannelToken");    
+    Result = OPI_Viber.GetChannelInformation(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetChannelInformation");
+        
+    Check_ViberOk(Result);
+
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure Viber_GetUserData() Export
+ 
+    Token        = OPI_GetTestData.GetParameter("Viber_ChannelToken"); 
+    User = OPI_GetTestData.GetParameter("Viber_ChannelAdminID");
+    Result    = OPI_Viber.GetUserData(Token, User);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetUserData");
+        
+    OPI_GetTestData.ExpectsThat(Result["chat_hostname"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["status_message"]).Filled();
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure Viber_GetOnlineUsers() Export
+ 
+    Token        = OPI_GetTestData.GetParameter("Viber_ChannelToken"); 
+    User = OPI_GetTestData.GetParameter("Viber_UserID");
+    Result    = OPI_Viber.GetOnlineUsers(Token, User);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetOnlineUsers");
+        
+    OPI_GetTestData.ExpectsThat(Result["users"]).HasType("Array");
+    Check_ViberOk(Result);
+    
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure Viber_SendTextMessage() Export
+ 
+    Text         = "TestMessage";
+    ChannelToken    = OPI_GetTestData.GetParameter("Viber_ChannelToken");
+    BotToken     = OPI_GetTestData.GetParameter("Viber_Token");   
+    User  = OPI_GetTestData.GetParameter("Viber_UserID");
+    Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID");
+    
+    ButtonArray  = New Array;
+    ButtonArray.Add("Button 1");
+    ButtonArray.Add("Button 2");
+    ButtonArray.Add("Button 3");
+    
+    Keyboard = OPI_Viber.CreateKeyboardFromArrayButton(ButtonArray);
+ 
+    Result  = OPI_Viber.SendTextMessage(BotToken, Text, User, False, Keyboard);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage");
+    
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    Result  = OPI_Viber.SendTextMessage(ChannelToken, Text, Administrator, True, Keyboard);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage");
+    
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Viber_SendImage() Export
+
+    Text         = "TestMessage";
+    Image      = OPI_GetTestData.GetParameter("Picture");
+    ChannelToken    = OPI_GetTestData.GetParameter("Viber_ChannelToken");
+    BotToken     = OPI_GetTestData.GetParameter("Viber_Token");   
+    User  = OPI_GetTestData.GetParameter("Viber_UserID");
+    Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID");
+     
+    Result  = OPI_Viber.SendImage(BotToken, Image, User, False, Text);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendImage");
+    
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    Result  = OPI_Viber.SendImage(ChannelToken, Image, Administrator, True, Text);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendImage");
+        
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Viber_SendFile() Export
+  
+    Document      = OPI_GetTestData.GetParameter("Document");
+    ChannelToken    = OPI_GetTestData.GetParameter("Viber_ChannelToken");
+    BotToken     = OPI_GetTestData.GetParameter("Viber_Token");   
+    User  = OPI_GetTestData.GetParameter("Viber_UserID");
+    Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID");
+       
+    Result  = OPI_Viber.SendFile(BotToken, Document, User, False, "docx");
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendFile");
+    
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    Result  = OPI_Viber.SendFile(ChannelToken, Document, Administrator, True, "docx");
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendFile");
+        
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Viber_SendContact() Export
+ 
+    Name           = "Petr Petrov";
+    Phone       = "+123456789";
+    ChannelToken    = OPI_GetTestData.GetParameter("Viber_ChannelToken");
+    BotToken     = OPI_GetTestData.GetParameter("Viber_Token");   
+    User  = OPI_GetTestData.GetParameter("Viber_UserID");
+    Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID");
+         
+    Result  = OPI_Viber.SendContact(BotToken, Name, Phone, User, False);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendContact");
+    
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    Result  = OPI_Viber.SendContact(ChannelToken, Name, Phone, Administrator, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendContact");
+        
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Viber_SendLocation() Export
+
+    Latitude        = "48.87373649724122";
+    Longitude       = "2.2954639195323967";
+    ChannelToken    = OPI_GetTestData.GetParameter("Viber_ChannelToken");
+    BotToken     = OPI_GetTestData.GetParameter("Viber_Token");   
+    User  = OPI_GetTestData.GetParameter("Viber_UserID");
+    Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID");
+         
+    Result  = OPI_Viber.SendLocation(BotToken, Latitude, Longitude, User, False);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendLocation");
+    
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    Result  = OPI_Viber.SendLocation(ChannelToken, Latitude, Longitude, Administrator, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendLocation");
+        
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Viber_SendLink() Export
+
+    URL           = "https://github.com/Bayselonarrend/OpenIntegrations";
+    ChannelToken    = OPI_GetTestData.GetParameter("Viber_ChannelToken");
+    BotToken     = OPI_GetTestData.GetParameter("Viber_Token");   
+    User  = OPI_GetTestData.GetParameter("Viber_UserID");
+    Administrator = OPI_GetTestData.GetParameter("Viber_ChannelAdminID");
+         
+    Result  = OPI_Viber.SendLink(BotToken, URL, User, False);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendLink");
+    
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    Result  = OPI_Viber.SendLink(ChannelToken, URL, Administrator, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendLink");
+        
+    OPI_GetTestData.ExpectsThat(Result["message_token"]).Filled();
+    Check_ViberOk(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+#EndRegion
+
+#Region GoogleWorkspace
+
+Procedure GV_GetAuthorizationLink() Export
+ 
+    ClientID  = OPI_GetTestData.GetParameter("Google_ClientID");    
+    Result = OPI_GoogleWorkspace.FormCodeRetrievalLink(ClientID);
+            
+    OPI_GetTestData.ExpectsThat(Result)
+        .HasType("String") 
+        .Filled();
+        
+    OPI_GetTestData.WriteParameter("Google_Link", Result);
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure GV_GetToken() Export
+ 
+    ClientID      = OPI_GetTestData.GetParameter("Google_ClientID");
+    ClientSecret  = OPI_GetTestData.GetParameter("Google_ClientSecret");
+    Code          = OPI_GetTestData.GetParameter("Google_Code");
+    
+    Result = OPI_GoogleWorkspace.GetTokenByCode(ClientID, ClientSecret, Code);
+           
+    If ValueFilled(Result["access_token"])
+        And ValueFilled(Result["refresh_token"]) Then
+        
+        OPI_GetTestData.WriteParameter("Google_Token"  , Result["access_token"]);
+        OPI_GetTestData.WriteParameter("Google_Refresh", Result["refresh_token"]);
+    
+    EndIf;
+    
+    OPI_Tools.Pause(5);
+      
+EndProcedure
+
+Procedure GV_UpdateToken() Export
+ 
+    ClientID      = OPI_GetTestData.GetParameter("Google_ClientID");
+    ClientSecret  = OPI_GetTestData.GetParameter("Google_ClientSecret");
+    RefreshToken  = OPI_GetTestData.GetParameter("Google_Refresh");
+    
+    Result = OPI_GoogleWorkspace.RefreshToken(ClientID, ClientSecret, RefreshToken);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match");                
+    OPI_GetTestData.ExpectsThat(Result["access_token"]).Filled();
+    
+    OPI_GetTestData.WriteParameter("Google_Token", Result["access_token"]);
+    
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+#EndRegion
+
+#Region GoogleCalendar
+
+Procedure GC_GetCalendarList() Export
+ 
+    Token     = OPI_GetTestData.GetParameter("Google_Token");    
+    Result = OPI_GoogleCalendar.GetCalendarList(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetCalendarList");
+    
+    OPI_GetTestData.ExpectsThat(Result)
+        .HasType("Array");
+
+    OPI_Tools.Pause(5);
+            
+EndProcedure
+
+Procedure GC_CreateDeleteCalendar() Export
+ 
+    Token                   = OPI_GetTestData.GetParameter("Google_Token"); 
+    Name            = "TestCalendar";
+    Description                = "TestDescription";
+    EditedName  = Name + " (fromм.)";
+    TypeMatch         = Type("Match");
+    TypeString               = Type("String");
+    Summary                 = "summary";
+    Black                  = "#000000";
+    Yellow                  = "#ffd800";
+    
+    Result = OPI_GoogleCalendar.CreateCalendar(Token, Name); 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateCalendar");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); 
+    OPI_GetTestData.ExpectsThat(Result[Summary]).Equal(Name);
+    OPI_GetTestData.ExpectsThat(Result["id"]).HasType(TypeString).Filled();
+        
+    Calendar = Result["id"];
+    
+    Result = OPI_GoogleCalendar.EditCalendarMetadata(Token
+        , Calendar
+        , EditedName
+        , Description);
+        
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditCalendarMetadata");
+    
+    Check_GKObject(Result, EditedName, Description);
+        
+    Result = OPI_GoogleCalendar.GetCalendarMetadata(Token, Calendar);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetCalendarMetadata");  
+    
+    Check_GKObject(Result, EditedName, Description);
+
+    Result = OPI_GoogleCalendar.AddCalendarToList(Token, Calendar);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddCalendarToList");
+    
+    Check_GKObject(Result, EditedName, Description);
+    
+    Result = OPI_GoogleCalendar.EditListCalendar(Token, Calendar, Black, Yellow, False);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditListCalendar");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); 
+    OPI_GetTestData.ExpectsThat(Result[Summary]).Equal(EditedName);
+    OPI_GetTestData.ExpectsThat(Result["foregroundColor"]).Equal(Black);
+    OPI_GetTestData.ExpectsThat(Result["backgroundColor"]).Equal(Yellow);
+        
+    Result = OPI_GoogleCalendar.GetListCalendar(Token, Calendar);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetListCalendar");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType(TypeMatch); 
+    OPI_GetTestData.ExpectsThat(Result[Summary]).Equal(EditedName);
+    OPI_GetTestData.ExpectsThat(Result["foregroundColor"]).Equal(Black);
+    OPI_GetTestData.ExpectsThat(Result["backgroundColor"]).Equal(Yellow);
+
+    Result = OPI_GoogleCalendar.ClearMainCalendar(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ClearMainCalendar");
+    
+    Check_Empty(Result);
+    
+    Result = OPI_GoogleCalendar.DeleteCalendarFromList(Token, Calendar);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteCalendarFromList");
+    
+    Check_Empty(Result);
+    
+    Result = OPI_GoogleCalendar.DeleteCalendar(Token, Calendar);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteCalendar");
+    
+    Check_Empty(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure GC_CreateDeleteEvent() Export
+ 
+    CurrentDate     = OPI_Tools.GetCurrentDate();
+    Token           = OPI_GetTestData.GetParameter("Google_Token"); 
+    Calendar       = OPI_GetTestData.GetParameter("Google_CalendarID");
+    Name    = "New event";
+    Description        = "TestEventDescription";
+    EditedDescription     = "TestEventDescription (fromм.)";
+    UID             = "id";
+    Hour             = 3600;
+
+    Attachments        = New Match;
+    
+    Attachments.Insert("Image1"
+        , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png");
+    Attachments.Insert("Image2"
+        , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1");
+    
+    EventMatch = New Match;
+    EventMatch.Insert("Description"                 , Description);
+    EventMatch.Insert("Title"                , Name);
+    EventMatch.Insert("Venue"          , "InOffice");
+    EventMatch.Insert("StartDate"               , CurrentDate);
+    EventMatch.Insert("EndDate"            , EventMatch["StartDate"] + Hour);
+    EventMatch.Insert("ArrayOfAttachmentURLs"  , Attachments);
+    EventMatch.Insert("SendNotifications"    , True);
+    
+    Result = OPI_GoogleCalendar.CreateEvent(Token, Calendar, EventMatch);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateEvent");
+    
+    Event   = Result[UID];
+    
+    Check_GKObject(Result, Name, Description);
+      
+    EventMatch = New Match;  
+    EventMatch.Insert("Description", EditedDescription);
+    
+    Result = OPI_GoogleCalendar.EditEvent(Token, Calendar, EventMatch, Event);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditEvent");
+    
+    Check_GKObject(Result, Name, EditedDescription);
+        
+    Result = OPI_GoogleCalendar.GetEvent(Token, Calendar, Event);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetEvent");
+    
+    Check_GKObject(Result, Name, EditedDescription);
+
+    Result = OPI_GoogleCalendar.MoveEvent(Token, Calendar, Calendar, Event);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "MoveEvent");
+    
+    Check_GKObject(Result, Name, EditedDescription);
+  
+    Result = OPI_GoogleCalendar.DeleteEvent(Token, Calendar, Event); 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteEvent");
+       
+    Check_Empty(Result);
+    
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure GC_GetEventList() Export
+ 
+    Token     = OPI_GetTestData.GetParameter("Google_Token");    
+    Calendar = OPI_GetTestData.GetParameter("Google_CalendarID");
+
+    Result = OPI_GoogleCalendar.GetEventList(Token, Calendar);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetEventList");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Array");
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+#EndRegion
+
+#Region GoogleDrive
+
+Procedure GD_GetCatalogList() Export
+ 
+    MimeType  = "mimeType";
+    Name      = "name";
+    Name       = "TestFolder";
+    Token     = OPI_GetTestData.GetParameter("Google_Token");
+    Result = OPI_GoogleDrive.GetDirectoriesList(Token, Name, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetDirectoriesList");
+    
+    Result = Result[0];
+    
+    OPI_GetTestData.ExpectsThat(Result["files"]).HasType("Array");
+    OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal("application/vnd.google-apps.folder");
+    OPI_GetTestData.ExpectsThat(Result[Name]).Filled();
+    
+    OPI_Tools.Pause(5);
+    Identifier = Result["id"];
+    
+    OPI_GetTestData.WriteParameter("GD_Catalog", Identifier);
+    
+    Result   = OPI_GoogleDrive.GetObjectInformation(Token, Identifier);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetObjectInformation");
+    
+    OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal("application/vnd.google-apps.folder");
+    OPI_GetTestData.ExpectsThat(Result[Name]).Filled();
+    
+    OPI_Tools.Pause(5);
+
+EndProcedure
+
+Procedure GD_UploadDeleteFile() Export
+ 
+    ExtraBytes = 2;
+    
+    Kind      = "kind";
+    Content   = "content";
+    MIME      = "MIME";
+    MimeType  = "mimeType";
+    Name      = "name";
+    Id_       = "id";
+    
+    ArrayOfDeletions = New Array;
+    Token           = OPI_GetTestData.GetParameter("Google_Token");
+    Image        = OPI_GetTestData.GetBinary("Picture");
+    ReplacementImage  = OPI_GetTestData.GetBinary("Picture2");
+    Directory         = OPI_GetTestData.GetParameter("GD_Catalog");
+    
+    Description = OPI_GoogleDrive.GetFileDescription();
+    Description.Insert("Parent", Directory);
+   
+    Result = OPI_GoogleDrive.UploadFile(Token, Image, Description);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile");
+    
+    OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal(Description[MIME]);
+    OPI_GetTestData.ExpectsThat(Result[Name]).Equal(Description["Name"]);
+
+    Identifier = Result[Id_];
+    ArrayOfDeletions.Add(Identifier);
+    
+    NewName  = "CopiedFile.jpeg";
+    Result = OPI_GoogleDrive.CopyObject(Token, Identifier, NewName, "root");
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CopyObject");
+    
+    OPI_Tools.Pause(5);
+    
+    OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal(Description[MIME]);
+    OPI_GetTestData.ExpectsThat(Result[Name]).Equal(NewName);
+       
+    ArrayOfDeletions.Add(Result[Id_]);
+    
+    Result = OPI_GoogleDrive.DownloadFile(Token, Identifier);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DownloadFile");
+    
+    OPI_GetTestData.ExpectsThat(Result.Size()).Equal(Image.Size() + ExtraBytes);
+    OPI_Tools.Pause(5);
+    
+    NewName  = "UpdatedFile.jpg";
+    Result = OPI_GoogleDrive.UpdateFile(Token, Identifier, ReplacementImage, NewName);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "UpdateFile");
+    
+    OPI_GetTestData.ExpectsThat(Result[MimeType]).Equal(Description[MIME]);
+    OPI_GetTestData.ExpectsThat(Result[Name]).Equal(NewName);
+
+    OPI_Tools.Pause(5);
+    
+    Comment = "Yo";
+    Result   = OPI_GoogleDrive.CreateComment(Token, Identifier, Comment);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateComment");
+  
+    OPI_GetTestData.ExpectsThat(Result[Content]).Equal(Comment);
+    OPI_GetTestData.ExpectsThat(Result[Kind]).Equal("drive#comment");
+    
+    OPI_Tools.Pause(5);
+     
+    For Each Deletable In ArrayOfDeletions Do
+        Result = OPI_GoogleDrive.DeleteObject(Token, Deletable);    
+        
+        // !OInt OPI_GetTestData.WriteLog(Result, "DeleteObject");
+      
+        OPI_GetTestData.ExpectsThat(ValueFilled(Result)).Equal(False);
+        OPI_Tools.Pause(2);
+    EndDo;
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure GD_CreateDeleteComment() Export
+    
+    Kind      = "kind";
+    Content   = "content";
+    Id_       = "id";
+    Comments  = "comments";
+    Token     = OPI_GetTestData.GetParameter("Google_Token");
+    Directory   = OPI_GetTestData.GetParameter("GD_Catalog");
+    Image  = OPI_GetTestData.GetBinary("Picture");
+    
+    Description  = OPI_GoogleDrive.GetFileDescription();
+    Description.Insert("Parent", Directory);
+    
+    Result     = OPI_GoogleDrive.UploadFile(Token, Image, Description);
+    Identifier = Result[Id_];
+    
+    Comment         = "NewComment";
+    ResultArray   = New Array;
+    Result           = OPI_GoogleDrive.CreateComment(Token, Identifier, Comment);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateComment");
+    
+    CommentID       = Result[Id_];
+    
+    ResultArray.Add(Result);
+    
+    Result = OPI_GoogleDrive.GetComment(Token, Identifier, CommentID);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetComment");
+    
+    ResultArray.Add(Result);
+    
+    Result         = OPI_GoogleDrive.GetCommentList(Token, Identifier);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetCommentList");
+    
+    Comments       = Result[Comments];
+    CommentObject = Comments[Comments.WithinBoundary()];
+    
+    ResultArray.Add(CommentObject);
+    
+    For Each Result In ResultArray Do     
+        OPI_GetTestData.ExpectsThat(Result[Content]).Equal(Comment);
+        OPI_GetTestData.ExpectsThat(Result[Kind]).Equal("drive#comment");
+    EndDo;
+    
+    Result = OPI_GoogleDrive.DeleteComment(Token, Identifier, CommentID);    
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteComment");
+    
+    OPI_GetTestData.ExpectsThat(ValueFilled(Result)).Equal(False);
+
+    OPI_GoogleDrive.DeleteObject(Token, Identifier);
+        
+EndProcedure
+
+Procedure GD_CreateCatalog() Export
+    
+    Name       = "name";
+    Name        = "TestFolder";
+    Token      = OPI_GetTestData.GetParameter("Google_Token");
+    Directory    = OPI_GetTestData.GetParameter("GD_Catalog");
+    
+    ResultArray = New Array;
+    
+    ResultArray.Add(OPI_GoogleDrive.CreateFolder(Token, Name));
+    ResultArray.Add(OPI_GoogleDrive.CreateFolder(Token, Name, Directory));
+    
+    For Each Result In ResultArray Do
+        
+        // !OInt OPI_GetTestData.WriteLog(Result, "CreateFolder");
+        
+        CatalogID = Result["id"];
+                
+        OPI_GetTestData.ExpectsThat(Result[Name]).Equal(Name);
+        
+        OPI_GoogleDrive.DeleteObject(Token, CatalogID);
+        
+    EndDo;
+
+EndProcedure
+
+#EndRegion
+
+#Region GoogleSheets
+
+Procedure GT_CreateTable() Export
+    
+    Token        = OPI_GetTestData.GetParameter("Google_Token");
+    Name = "TestTable";
+    
+    SheetArray = New Array;
+    SheetArray.Add("Sheet1");
+    SheetArray.Add("Sheet2");
+    
+    Result = OPI_GoogleSheets.CreateBook(Token, Name, SheetArray);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateBook");
+    
+    OPI_GetTestData.ExpectsThat(Result["properties"]["title"]).Equal(Name);
+
+    For N = 0 For SheetArray.WithinBoundary() Do
+        
+        SheetName = Result["sheets"][N]["properties"]["title"];
+        OPI_GetTestData.ExpectsThat(SheetName).Equal(SheetArray[N]);
+        Sheet = Result["sheets"][N]["properties"]["sheetId"];
+        Sheet = OPI_Tools.NumberToString(Sheet);
+        
+    EndDo;
+    
+    Book   = Result["spreadsheetId"];
+    
+    OPI_GetTestData.WriteParameter("GS_Spreadsheet", Book);
+    OPI_GetTestData.WriteParameter("GS_Sheet"      , Sheet);
+    
+    Result = OPI_GoogleSheets.CreateBook(Token, Name, SheetArray);
+    Book2  = Result["spreadsheetId"];
+    
+    Result = OPI_GoogleSheets.CopySheet(Token, Book, Book2, Sheet);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CopySheet");
+
+    OPI_GetTestData.ExpectsThat(Result["title"]).Equal(SheetName + " (toопия)");
+    
+    Name = "TestSheet";
+        
+    Result = OPI_GoogleSheets.AddSheet(Token, Book, Name);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddSheet");
+
+    NewSheet = Result["replies"][0]["addSheet"]["properties"]["sheetId"];
+    NewSheet = OPI_Tools.NumberToString(NewSheet);
+    
+    OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book); 
+
+    Result = OPI_GoogleSheets.DeleteSheet(Token, Book, NewSheet);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteSheet");
+    
+    OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book);
+    
+    Name = "TestTable (fromм.)";
+    
+    Result    = OPI_GoogleSheets.EditBookTitle(Token, Book, Name);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditBookTitle");
+    
+    OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book);
+    
+EndProcedure
+
+Procedure GT_GetTable() Export
+    
+    Token        = OPI_GetTestData.GetParameter("Google_Token");
+    Book        = OPI_GetTestData.GetParameter("GS_Spreadsheet");
+    Name = "TestTable (fromм.)";
+
+    Result = OPI_GoogleSheets.GetBook(Token, Book);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetTable");
+    
+    OPI_GetTestData.ExpectsThat(Result["properties"]["title"]).Equal(Name);
+
+EndProcedure
+
+Procedure GT_FillClearCells() Export
+    
+    Token        = OPI_GetTestData.GetParameter("Google_Token");
+    Book        = OPI_GetTestData.GetParameter("GS_Spreadsheet");
+    Sheet         = "Sheet2";
+
+    CellStructure = New Match;
+    CellStructure.Insert("A1", "ThisIsA1");
+    CellStructure.Insert("A2", "ThisIsA2");
+    CellStructure.Insert("B2", "ThisIsB2");
+    CellStructure.Insert("B3", "ThisIsB3");
+    CellStructure.Insert("A3", "ThisIsA3");
+    CellStructure.Insert("A4", "ThisIsA4");
+    CellStructure.Insert("B1", "ThisIsB1");
+    CellStructure.Insert("B4", "ThisIsB4");
+    
+    Cell array = New Array;
+    Cell array.Add("B2");
+    Cell array.Add("A3");
+    Cell array.Add("B4");
+
+    Result = OPI_GoogleSheets.SetCellValues(Token, Book, CellStructure, Sheet);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SetCellValues");
+    
+    OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book);
+    OPI_GetTestData.ExpectsThat(Result["totalUpdatedCells"]).Equal(CellStructure.Quantity());
+    
+    Result = OPI_GoogleSheets.GetCellValues(Token, Book, Cell array, Sheet);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetCellValues");
+    
+    OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book);
+    OPI_GetTestData.ExpectsThat(Result["valueRanges"].Quantity()).Equal(Cell array.Quantity());
+    
+    Result = OPI_GoogleSheets.GetCellValues(Token, Book, , Sheet);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetCellValues");
+    
+    OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book);
+    
+    Cell array = New Array;
+    Cell array.Add("B2");
+    Cell array.Add("A3");
+    Cell array.Add("B4");
+
+    Result = OPI_GoogleSheets.ClearCells(Token, Book, Cell array, Sheet);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ClearCells");
+    
+    OPI_GetTestData.ExpectsThat(Result["spreadsheetId"]).Equal(Book);
+    OPI_GetTestData.ExpectsThat(Result["clearedRanges"].Quantity()).Equal(Cell array.Quantity());
+
+EndProcedure
+
+#EndRegion
+
+#Region Twitter
+
+Procedure Twitter_GetAuthorizationLink() Export
+ 
+    Parameters = GetTwitterParameters();
+    Result = OPI_Twitter.GetAuthorizationLink(Parameters);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("String").Filled();
+    
+    OPI_GetTestData.WriteParameter("Twitter_URL", Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Twitter_UpdateToken() Export
+ 
+    Parameters = GetTwitterParameters();
+    Result = OPI_Twitter.RefreshToken(Parameters);
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["access_token"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["refresh_token"]).Filled();
+        
+    Refresh = Result["refresh_token"];
+    Token  = Result["access_token"];
+    
+    If ValueFilled(Refresh) And Not Refresh = "null" Then   
+        OPI_GetTestData.WriteParameter("Twitter_Refresh", Refresh);
+    EndIf;
+    
+    If ValueFilled(Token) And Not Token = "null" Then
+        OPI_GetTestData.WriteParameter("Twitter_Token"  , Token);
+    EndIf;
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Twitter_CreateTextTweet() Export
+ 
+    Parameters = GetTwitterParameters();
+    Text     = "TestTweet" + String(New UniqueIdentifier);
+    
+    Result = OPI_Twitter.CreateTextTweet(Text, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateTextTweet");
+    
+    Check_TwitterText(Result, Text);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Twitter_CreateTweetWithImage() Export
+ 
+    Parameters = GetTwitterParameters();
+    Text     = "TestTweet" + String(New UniqueIdentifier);
+    Image  = OPI_GetTestData.GetBinary("Picture");
+    AndVF       = GetTempFileName("png");
+    Image.Write(AndVF);
+   
+    Result = OPI_Twitter.Create image tweet(Text, Image, Parameters); 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "Create image tweet");
+    
+    Check_TwitterText(Result, Text);    
+    
+    Result = OPI_Twitter.Create image tweet(Text, AndVF, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "Create image tweet");
+    
+    Check_TwitterText(Result, Text);
+    
+    DeleteFiles(AndVF);
+    
+    OPI_Tools.Pause(20);
+    
+EndProcedure
+
+Procedure Twitter_CreateTweetWithVideo() Export
+ 
+    Parameters = GetTwitterParameters();
+    Text     = "TestTweet" + String(New UniqueIdentifier);
+    Video     = OPI_GetTestData.GetBinary("Video");
+    AndVF       = GetTempFileName("mp4");
+    Video.Write(AndVF);
+   
+    Result = OPI_Twitter.CreateVideoTweet(Text, Video, Parameters);    
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateVideoTweet");
+    
+    Check_TwitterText(Result, Text);    
+    
+    Result = OPI_Twitter.CreateVideoTweet(Text, AndVF, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateVideoTweet");
+    
+    Check_TwitterText(Result, Text);
+    
+    DeleteFiles(AndVF);
+    
+    OPI_Tools.Pause(20);
+    
+EndProcedure
+
+Procedure Twitter_CreateTweetWithGif() Export
+ 
+    Parameters = GetTwitterParameters();
+    Text     = "TestTweet" + String(New UniqueIdentifier);
+    GIF     = OPI_GetTestData.GetBinary("GIF");
+    AndVF       = GetTempFileName("gif");
+    GIF.Write(AndVF);
+   
+    Result = OPI_Twitter.CreateGifTweet(Text, GIF, Parameters);   
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateGifTweet");
+     
+    Check_TwitterText(Result, Text);    
+    
+    Result = OPI_Twitter.CreateGifTweet(Text, AndVF, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateGifTweet");
+    
+    Check_TwitterText(Result, Text);
+    
+    DeleteFiles(AndVF);
+    
+    OPI_Tools.Pause(20);
+    
+EndProcedure
+
+Procedure Twitter_CreateTweetWithPoll() Export
+ 
+    Parameters       = GetTwitterParameters();
+    Text           = "TestTweet" + String(New UniqueIdentifier);
+    AnswersArray   = New Array;
+    AnswersArray.Add("Option 1");
+    AnswersArray.Add("Option 2");
+   
+    Result = OPI_Twitter.CreatePollTweet(Text, AnswersArray, 60, Parameters);
+ 
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreatePollTweet");
+    
+    Check_TwitterText(Result, Text);
+    
+    OPI_Tools.Pause(20);
+    
+EndProcedure
+
+#EndRegion
+
+#Region Notion
+
+Procedure Notion_CreatePage() Export
+	
+	Token     = OPI_GetTestData.GetParameter("Notion_Token");
+	Parent  = OPI_GetTestData.GetParameter("Notion_Parent");
+	Title = "TestTitle";
+	 
+	Result = OPI_Notion.CreatePage(Token, Parent, Title);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "CreatePage");
+    
+    Check_NotionObject(Result);
+
+EndProcedure
+
+Procedure Notion_CreateEditDatabase() Export
+	
+	Token     = OPI_GetTestData.GetParameter("Notion_Token");
+	Parent  = OPI_GetTestData.GetParameter("Notion_Parent");
+	Title = "TestTitle";
+	
+	Properties = New Match;
+	Properties.Insert("Name"            , "title");
+	Properties.Insert("Description"       , "rich_text");
+	Properties.Insert("Number"          , "number");
+	Properties.Insert("Status"         , "status");
+	Properties.Insert("CreationDate"  , "date");
+	Properties.Insert("Image"       , "files");
+	Properties.Insert("Active"        , "checkbox");
+	Properties.Insert("Website"           , "url");
+	Properties.Insert("Email"          , "email");
+	Properties.Insert("Phone"        , "phone_number");
+	Properties.Insert("User"   , "people");
+	
+	ValueSelection = New Match;
+	ValueSelection.Insert("New", "green");
+	ValueSelection.Insert("InProgress", "yellow");
+	ValueSelection.Insert("Remote", "red");
+	Properties.Insert("Status", ValueSelection);
+	
+	Result = OPI_Notion.CreateDatabase(Token, Parent, Title, Properties); 
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "CreateDatabase");
+    
+    Check_NotionObject(Result, "database");
+    
+    Base      = Result["id"];
+    Title = "TestTitle";
+	Description  = "TestDescription";
+	
+	Properties = New Match;
+	Properties.Insert("Email", "rich_text"); // Type fields "Email" will changed with email to text
+	Properties.Insert("Website");               // Field "Website" will deleted
+	
+	Result = OPI_Notion.EditDatabaseProperties(Token, Base, Properties, Title, Description);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "EditDatabaseProperties");
+    
+    Check_NotionObject(Result, "database");
+
+EndProcedure
+
+Procedure Notion_GetPageInfo() Export
+	
+	Token     = OPI_GetTestData.GetParameter("Notion_Token");
+	Page  = OPI_GetTestData.GetParameter("Notion_Page");
+	
+	Result = OPI_Notion.GetPage(Token, Page);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "GetPage");
+    
+    Check_NotionObject(Result);	
+    
+EndProcedure
+
+Procedure Notion_GetDatabaseInfo() Export
+
+	Token     = OPI_GetTestData.GetParameter("Notion_Token");
+	Base      = OPI_GetTestData.GetParameter("Notion_Base");
+		
+	Result = OPI_Notion.GetDatabase(Token, Base);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "GetDatabase");
+    
+    Check_NotionObject(Result, "database");
+    
+EndProcedure
+
+Procedure Notion_CreatePageInDatabase() Export
+	
+	Token = OPI_GetTestData.GetParameter("Notion_Token");
+	Base  = OPI_GetTestData.GetParameter("Notion_Base");
+	
+	Image = New Match;
+	Image.Insert("Logo", OPI_GetTestData.GetParameter("Picture"));
+	
+	Properties = New Match;
+	Properties.Insert("Name"            , "LLC Vector");
+	Properties.Insert("Description"       , "OurFirstClient");
+	Properties.Insert("Number"          , 1);
+	Properties.Insert("Status"         , "Regular");
+	Properties.Insert("CreationDate"  , OPI_Tools.GetCurrentDate());
+	Properties.Insert("Image"       , Image);
+	Properties.Insert("Active"        , True);
+	Properties.Insert("Website"           , "https://vector.ru");
+	Properties.Insert("Email"          , "mail@vector.ru");
+	Properties.Insert("Phone"        , "88005553535");
+	Properties.Insert("Status"	       , "New");
+	
+	Result = OPI_Notion.CreatePageInDatabase(Token, Base, Properties);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "CreatePageInDatabase");
+    
+    Check_NotionObject(Result);
+    
+    Parent = StringReplace(Result["parent"]["database_id"], "-", "");
+    OPI_GetTestData.ExpectsThat(Parent).Equal(Base);
+       	 
+EndProcedure
+
+Procedure Notion_EditPageProperties() Export
+	
+	Token        = OPI_GetTestData.GetParameter("Notion_Token");
+	Page     = OPI_GetTestData.GetParameter("Notion_Page");
+	Icon       = OPI_GetTestData.GetParameter("Picture");
+	Cover      = OPI_GetTestData.GetParameter("Picture2");
+	Archive = False;
+	
+	Properties = New Match;
+	Properties.Insert("Active"     , False);
+	Properties.Insert("Email"       , "vector@mail.ru");
+	
+	Result = OPI_Notion.EditPageProperties(Token
+		, Page
+		, Properties
+		, Icon
+		, Cover
+		, Archive);
+          
+	// !OInt OPI_GetTestData.WriteLog(Result, "EditPageProperties");
+    
+    Check_NotionObject(Result);
+    
+EndProcedure
+
+Procedure Notion_CreateDeleteBlock() Export
+	
+	Token     = OPI_GetTestData.GetParameter("Notion_Token");
+	Parent  = OPI_GetTestData.GetParameter("Notion_Parent");
+	Block      = OPI_GetTestData.GetParameter("Notion_Block");
+	
+	Result = OPI_Notion.ReturnBlock(Token, Block);	
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ReturnBlock");
+    
+    Check_NotionObject(Result, "block");
+    
+	Result = OPI_Notion.CreateBlock(Token, Parent, Result);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "CreateBlock");
+    
+    Check_NotionObject(Result, "list");
+    
+    Block      = Result["results"][0]["id"];
+	Result = OPI_Notion.ReturnChildBlocks(Token, Block);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "ReturnChildBlocks");
+    
+    Check_NotionObject(Result, "list");
+    
+	Result = OPI_Notion.DeleteBlock(Token, Block);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "DeleteBlock");
+    
+    Check_NotionObject(Result, "block");
+    
+EndProcedure
+
+Procedure Notion_GetUsers() Export
+	
+	Token     = OPI_GetTestData.GetParameter("Notion_Token");
+	Result = OPI_Notion.UserList(Token);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "UserList");
+    
+    Check_NotionObject(Result, "list");
+    
+EndProcedure
+
+Procedure Notion_GetUserData() Export
+	
+	Token        = OPI_GetTestData.GetParameter("Notion_Token");
+	User = OPI_GetTestData.GetParameter("Notion_User"); 
+	Result    = OPI_Notion.GetUserData(Token, User);
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "GetUserData");
+    
+    Check_NotionObject(Result, "user");
+    
+EndProcedure
+
+#EndRegion
+
+#Region Slack
+
+Procedure Slack_GetBotInfo() Export
+    
+    Token     = OPI_GetTestData.GetParameter("Slack_Token");
+    Result = OPI_Slack.GetBotInformation(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetBotInformation");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["bot_id"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["user_id"]).Filled();
+    
+EndProcedure
+
+Procedure Slack_GetUserList() Export
+    
+    Token     = OPI_GetTestData.GetParameter("Slack_Token");
+    Result = OPI_Slack.GetUserList(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetUserList");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["members"]).HasType("Array");
+    
+EndProcedure
+
+Procedure Slack_GetRegionList() Export
+    
+    Token     = OPI_GetTestData.GetParameter("Slack_Token");
+    Result = OPI_Slack.GetWorkspaceList(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetWorkspaceList");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["teams"]).HasType("Array");
+    
+EndProcedure
+
+Procedure Slack_SendDeleteMessage() Export
+
+    Token    = OPI_GetTestData.GetParameter("Slack_Token"); 
+    Channel    = OPI_GetTestData.GetParameter("Slack_Channel");
+    Text    = "TestMessage1";
+    Text2   = "TestMessage2";
+    Tags  = New Array;
+    Image = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
+    
+    Result = OPI_Slack.SendMessage(Token, Channel, Text);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel);
+    OPI_GetTestData.ExpectsThat(Result["ts"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["message"]["text"]).Equal(Text);
+    
+    Timestamp = Result["ts"];
+    
+    Result = OPI_Slack.EditMessage(Token, Channel, Timestamp, Text2);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditMessage");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel);
+    OPI_GetTestData.ExpectsThat(Result["ts"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["message"]["text"]).Equal(Text2);
+        
+    Result = OPI_Slack.GetMessageReplyList(Token, Channel, Timestamp);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetMessageReplyList");
+        
+    OPI_GetTestData.ExpectsThat(Result["messages"]).HasType("Array");
+    
+    Result = OPI_Slack.GetMessageLink(Token, Channel, Timestamp);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetMessageLink");
+        
+    OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel);
+    OPI_GetTestData.ExpectsThat(Result["permalink"]).Filled();
+        
+    Check_SlackOk(Result);
+      
+    Tags.Add(Timestamp);
+    
+    BlockArray = New Array;
+    Block         = OPI_Slack.GenerateImageBlock(Image, "Yo");
+    BlockArray.Add(Block);
+    
+    Result = OPI_Slack.SendMessage(Token, Channel, Text, , BlockArray);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage (toартинtoа)");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel);
+    OPI_GetTestData.ExpectsThat(Result["ts"]).Filled();
+    
+    Tags.Add(Result["ts"]);
+    
+    Block = OPI_Slack.GenerateImageBlock(Image, "Yo");
+    JSONBlock = OPI_Tools.JSONString(Block);
+    
+    AndVF = GetTempFileName("json");
+    
+    TextDocument = New TextDocument();
+    TextDocument.SetText(JSONBlock);
+    TextDocument.Write(AndVF);
+        
+    Result = OPI_Slack.SendMessage(Token, Channel, Text, , AndVF);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage (json)");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel);
+    OPI_GetTestData.ExpectsThat(Result["ts"]).Filled();
+    
+    Tags.Add(Result["ts"]);
+    
+    Blocks = "['" + AndVF + "','" + AndVF + "']";
+    Result = OPI_Slack.SendMessage(Token, Channel, Text, , Blocks);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage (json маwithwithиin)");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel);
+    OPI_GetTestData.ExpectsThat(Result["ts"]).Filled();
+    
+    Tags.Add(Result["ts"]);
+
+    DeleteFiles(AndVF);
+ 
+    For Each Timestamp In Tags Do
+        
+        Result = OPI_Slack.DeleteMessage(Token, Channel, Timestamp);
+        
+        // !OInt OPI_GetTestData.WriteLog(Result, "DeleteMessage");
+
+        Check_SlackOk(Result);
+        OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel);
+        OPI_GetTestData.ExpectsThat(Result["ts"]).Filled();
+    
+    EndDo;
+    
+    Hour       = 3600;
+    Day     = 24;
+    Sending  = OPI_Tools.GetCurrentDate() + (Day * Hour);
+    Result = OPI_Slack.SendMessage(Token, Channel, Text, Sending);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage (отложенное)");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["channel"]).Equal(Channel);
+    OPI_GetTestData.ExpectsThat(Result["scheduled_message_id"]).Filled();
+    
+    Timestamp   = Result["scheduled_message_id"];
+    Result = OPI_Slack.DeleteMessage(Token, Channel, Timestamp, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteMessage");
+
+    Check_SlackOk(Result);
+
+EndProcedure
+
+Procedure Slack_SendDeleteEphemeral() Export
+   
+    Token        = OPI_GetTestData.GetParameter("Slack_Token"); 
+    Channel        = OPI_GetTestData.GetParameter("Slack_Channel");
+    User = OPI_GetTestData.GetParameter("Slack_User");
+    Image     = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
+    Text        = "TestMessage1";
+    
+    Block      = OPI_Slack.GenerateImageBlock(Image, "Yo");
+    Result = OPI_Slack.SendEphemeralMessage(Token, Channel, Text, User, Block);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["message_ts"]).Filled();
+     
+EndProcedure
+
+Procedure Slack_GetScheduledMessages() Export
+    
+    Token    = OPI_GetTestData.GetParameter("Slack_Token"); 
+    Channel    = OPI_GetTestData.GetParameter("Slack_Channel");
+    
+    Result = OPI_Slack.GetDelayedMessageList(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetDelayedMessageList");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["scheduled_messages"]).HasType("Array");
+   
+EndProcedure
+
+Procedure Slack_CreateArchiveChannel() Export
+    
+    Token        = OPI_GetTestData.GetParameter("Slack_Token");
+    User = OPI_GetTestData.GetParameter("Slack_User");
+    Name          = "testconv" + String(New UniqueIdentifier);
+    Topic         = "TestTopic";
+    Purpose         = "TestGoal";
+    
+    #Region CreateChannel
+    Result = OPI_Slack.CreateChannel(Token, Name);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateChannel");
+    
+    Data = Result["channel"];
+    Channel  = Data["id"];
+
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name);
+    #EndRegion
+
+    #Region SetChannelTopic
+    Result = OPI_Slack.SetChannelTopic(Token, Channel, Topic);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SetChannelTopic");
+    
+    Data = Result["channel"];
+    Channel  = Data["id"];
+
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name);
+    OPI_GetTestData.ExpectsThat(Data["topic"]["value"]).Equal(Topic);
+    #EndRegion
+    
+    #Region SetChannelGoal
+    Result = OPI_Slack.SetChannelGoal(Token, Channel, Purpose);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SetChannelGoal");
+    
+    Check_SlackOk(Result);
+    #EndRegion
+    
+    #Region GetChannel
+    Result = OPI_Slack.GetChannel(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetChannel");
+    
+    Data = Result["channel"];
+    Channel  = Data["id"];
+
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name);
+    #EndRegion
+    
+    #Region InviteUsersToChannel
+    Result = OPI_Slack.InviteUsersToChannel(Token, Channel, User);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "InviteUsersToChannel");
+    
+    Data = Result["channel"];
+    Channel  = Data["id"];
+
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name);
+    #EndRegion
+    
+    #Region KickUserFromChannel
+    Result = OPI_Slack.KickUserFromChannel(Token, Channel, User);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "KickUserFromChannel");
+    
+    Check_SlackOk(Result);
+    #EndRegion
+    
+    #Region GetChannelHistory
+    Result = OPI_Slack.GetChannelHistory(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetChannelHistory");
+        
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["messages"]).HasType("Array");
+    #EndRegion
+    
+    #Region GetChannelUserList
+    Result = OPI_Slack.GetChannelUserList(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetChannelUserList");
+        
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["members"]).HasType("Array");
+    #EndRegion
+
+    #Region LeaveChannel
+    Result = OPI_Slack.LeaveChannel(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "LeaveChannel");
+    
+    Check_SlackOk(Result);
+    #EndRegion
+    
+    #Region JoinChannel
+    Result = OPI_Slack.JoinChannel(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "JoinChannel");
+    
+    Data = Result["channel"];
+    Channel  = Data["id"];
+
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Data["name"]).Equal(Name);
+    #EndRegion
+    
+    #Region RenameChannel
+    NewName  = "testconv" + String(New UniqueIdentifier);
+    Result = OPI_Slack.RenameChannel(Token, Channel, NewName);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "RenameChannel");
+    
+    Data = Result["channel"];
+    Channel  = Data["id"];
+
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Data["name"]).Equal(NewName);
+    #EndRegion
+    
+    #Region ArchiveChannel
+    Result = OPI_Slack.ArchiveChannel(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ArchiveChannel");
+    
+    Check_SlackOk(Result);
+    #EndRegion
+    
+EndProcedure
+
+Procedure Slack_GetChannelList() Export
+    
+    Token = OPI_GetTestData.GetParameter("Slack_Token");
+    
+    Result = OPI_Slack.GetChannelList(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetChannelList");
+
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["channels"]).HasType("Array");
+    
+EndProcedure
+
+Procedure Slack_OpenCloseDialog() Export
+    
+    Token        = OPI_GetTestData.GetParameter("Slack_Token");
+    User = OPI_GetTestData.GetParameter("Slack_User");
+    Text        = "Yo, dude";
+    
+    Result = OPI_Slack.OpenDialog(Token, User);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "OpenDialog");
+
+    Dialog = Result["channel"]["id"];
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["channel"]).HasType("Match");
+    OPI_GetTestData.ExpectsThat(Dialog).Filled();
+    
+    Result = OPI_Slack.SendMessage(Token, Dialog, Text);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendMessage");
+    
+    Check_SlackOk(Result);
+
+    Result = OPI_Slack.CloseDialog(Token, Dialog);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CloseDialog");
+
+    Check_SlackOk(Result);
+
+EndProcedure
+
+Procedure Slack_GetFileList() Export
+    
+    Token = OPI_GetTestData.GetParameter("Slack_Token");
+    Channel = OPI_GetTestData.GetParameter("Slack_Channel");
+    
+    Result = OPI_Slack.GetFilesList(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetFilesList");
+
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["files"]).HasType("Array");
+
+EndProcedure
+
+Procedure Slack_UploadDeleteFile() Export
+    
+    Token        = OPI_GetTestData.GetParameter("Slack_Token");
+    File         = OPI_GetTestData.GetBinary("Document");
+    Channel        = OPI_GetTestData.GetParameter("Slack_Channel");
+    ArrayOfFiles = New Array;
+    FileName     = "megadoc.docx";
+    Title    = "NewFile";
+    
+    Result = OPI_Slack.UploadFile(Token, File, FileName, Title);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile");
+
+    UploadedFile = Result["files"][0];
+    ArrayOfFiles.Add(UploadedFile["id"]);
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(UploadedFile["name"]).Equal(FileName);
+    
+    Result = OPI_Slack.UploadFile(Token, File, FileName, Title, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile (in toаtoл)");
+
+    UploadedFile = Result["files"][0];
+    ArrayOfFiles.Add(UploadedFile["id"]);
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(UploadedFile["name"]).Equal(FileName);
+    
+    Result = OPI_Slack.GetFileData(Token, UploadedFile["id"]);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetFile");
+    
+    UploadedFile = Result["file"];
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(UploadedFile["name"]).Equal(FileName);
+        
+    For Each UploadedFile In ArrayOfFiles Do
+        
+        Result = OPI_Slack.DeleteFile(Token, UploadedFile);
+        
+        // !OInt OPI_GetTestData.WriteLog(Result, "DeleteFile");
+        
+        Check_SlackOk(Result);
+        
+    EndDo;
+
+EndProcedure
+
+Procedure Slack_GetExternalFileList() Export
+    
+    Token = OPI_GetTestData.GetParameter("Slack_Token");
+    Channel = OPI_GetTestData.GetParameter("Slack_Channel");
+    
+    Result = OPI_Slack.GetExternalFileList(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetExternalFileList");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["files"]).HasType("Array");
+    
+    Result = OPI_Slack.GetExternalFileList(Token, Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetExternalFileList");
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(Result["files"]).HasType("Array");
+    
+EndProcedure
+
+Procedure Slack_UploadDeleteExternalFile() Export
+    
+    Token        = OPI_GetTestData.GetParameter("Slack_Token");
+    File         = OPI_GetTestData.GetParameter("Document");
+    Channel        = OPI_GetTestData.GetParameter("Slack_Channel");
+    Title    = "NewFile";
+    
+    Result = OPI_Slack.AddExternalFile(Token, File, Title);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddExternalFile");
+    
+    UploadedFile = Result["file"];
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(UploadedFile["title"]).Equal(Title);
+    
+    Result = OPI_Slack.GetExternalFile(Token, UploadedFile["id"]);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetExternalFile");
+    
+    UploadedFile = Result["file"];
+    
+    Check_SlackOk(Result);
+    OPI_GetTestData.ExpectsThat(UploadedFile["title"]).Equal(Title);
+    
+    Result = OPI_Slack.SendExternalFile(Token, UploadedFile["id"], Channel);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendExternalFile");
+    
+    Check_SlackOk(Result);
+    
+    Result = OPI_Slack.DeleteExternalFile(Token, UploadedFile["id"]);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendExternalFile");
+    
+    Check_SlackOk(Result);
+    
+EndProcedure
+
+#EndRegion
+
+#Region Airtable
+
+Procedure AT_CreateDatabase() Export
+    
+    Token        = OPI_GetTestData.GetParameter("Airtable_Token");
+    Region      = OPI_GetTestData.GetParameter("Airtable_Workspace");
+    Name = "TestDatabase";
+    
+    FieldArray = New Array;
+    FieldArray.Add(OPI_Airtable.GetNumberField("Number"));
+    FieldArray.Add(OPI_Airtable.GetStringField("String"));
+    
+    TableName = "TestTable";
+    
+    TableMapping = New Match;
+    TableMapping.Insert(TableName, FieldArray);
+    
+    Result = OPI_Airtable.CreateDatabase(Token, Region, Name, TableMapping);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateDatabase");
+    
+    OPI_GetTestData.ExpectsThat(Result["id"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["tables"][0]["name"]).Equal(TableName);
+    
+    Base = Result["id"];
+    OPI_GetTestData.WriteParameter("Airtable_Base", Base);
+    
+    Result = OPI_Airtable.GetDatabaseTables(Token, Base);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetDatabaseTables");
+    
+    OPI_GetTestData.ExpectsThat(Result["tables"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["tables"]).HasType("Array");
+
+    Result = OPI_Airtable.GetListOfBases(Token);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetListOfBases");
+    
+    OPI_GetTestData.ExpectsThat(Result["bases"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["bases"]).HasType("Array");
+ 
+EndProcedure
+
+Procedure AT_CreateTable() Export
+    
+    Token = OPI_GetTestData.GetParameter("Airtable_Token");
+    Base  = OPI_GetTestData.GetParameter("Airtable_Base");
+    
+    FieldArray = New Array;
+    FieldArray.Add(OPI_Airtable.GetNumberField("Number"));    
+    // !OInt OPI_GetTestData.WriteLog(FieldArray[0], "GetNumberField");
+    
+    FieldArray.Add(OPI_Airtable.GetStringField("String"));
+    // !OInt OPI_GetTestData.WriteLog(FieldArray[1], "GetStringField");
+    
+    FieldArray.Add(OPI_Airtable.GetAttachmentField("Attachment"));
+    // !OInt OPI_GetTestData.WriteLog(FieldArray[2], "GetAttachmentField");
+    
+    FieldArray.Add(OPI_Airtable.GetCheckboxField("Checkbox"));
+    // !OInt OPI_GetTestData.WriteLog(FieldArray[3], "GetCheckboxField");
+    
+    FieldArray.Add(OPI_Airtable.GetDateField("Date"));
+    // !OInt OPI_GetTestData.WriteLog(FieldArray[4], "GetDateField");
+    
+    FieldArray.Add(OPI_Airtable.GetPhoneField("Phone"));
+    // !OInt OPI_GetTestData.WriteLog(FieldArray[5], "GetPhoneField");
+        
+    FieldArray.Add(OPI_Airtable.GetEmailField("Email"));
+    // !OInt OPI_GetTestData.WriteLog(FieldArray[6], "GetEmailField");    
+    
+    FieldArray.Add(OPI_Airtable.GetLinkField("Link"));
+    // !OInt OPI_GetTestData.WriteLog(FieldArray[7], "GetLinkField");    
+    
+    TableName = "TestTable2";
+    Description   = "NewTable";
+    
+    Result = OPI_Airtable.CreateTable(Token, Base, TableName, FieldArray, Description);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateTable");
+    
+    OPI_GetTestData.ExpectsThat(Result["name"]).Equal(TableName);
+    OPI_GetTestData.ExpectsThat(Result["description"]).Equal(Description);
+    
+    Table    = Result["id"];
+    TableName = "TestTable2 (fromм.)";
+    Description   = "NewTable (fromм.)";
+   
+    OPI_GetTestData.WriteParameter("Airtable_Table", Table);
+    
+    Result = OPI_Airtable.ModifyTable(Token, Base, Table, TableName, Description);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ModifyTable");
+    
+    OPI_GetTestData.ExpectsThat(Result["name"]).Equal(TableName);
+    OPI_GetTestData.ExpectsThat(Result["description"]).Equal(Description);
+
+EndProcedure
+
+Procedure AT_CreateField() Export
+    
+    Token   = OPI_GetTestData.GetParameter("Airtable_Token");
+    Base    = OPI_GetTestData.GetParameter("Airtable_Base");
+    Table = OPI_GetTestData.GetParameter("Airtable_Table");
+    Name     = String(New UniqueIdentifier);
+    
+    Field = OPI_Airtable.GetNumberField(Name);
+    
+    Result = OPI_Airtable.CreateField(Token, Base, Table, Field);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateField");
+    
+    OPI_GetTestData.ExpectsThat(Result["name"]).Equal(Name);
+    
+    Field      = Result["id"]; 
+    Name       = Name + "(fromм.)";
+    Description  = "New description";
+    
+    Result = OPI_Airtable.ModifyField(Token, Base, Table, Field, Name, Description);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ModifyField");
+    
+    OPI_GetTestData.ExpectsThat(Result["name"]).Equal(Name);
+    OPI_GetTestData.ExpectsThat(Result["description"]).Equal(Description);
+    
+EndProcedure
+
+Procedure AT_CreateDeleteRecords() Export
+
+    Token   = OPI_GetTestData.GetParameter("Airtable_Token");
+    Base    = OPI_GetTestData.GetParameter("Airtable_Base");
+    Table = OPI_GetTestData.GetParameter("Airtable_Table");
+    
+    Numeric = 10;
+    StringType = "Hello";
+    
+    RowDescription1 = New Structure("Number,String", Numeric, StringType);
+    RowDescription2 = New Structure("Number,String", Numeric, StringType);
+    
+    ArrayOfDeletions = New Array;
+    ArrayOfDescriptions  = New Array;
+    ArrayOfDescriptions.Add(RowDescription1);
+    ArrayOfDescriptions.Add(RowDescription2);
+    
+    Result = OPI_Airtable.CreatePosts(Token, Base, Table, ArrayOfDescriptions);
+
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreatePosts");
+    
+    OPI_GetTestData.ExpectsThat(Result["records"]).HasType("Array");
+    OPI_GetTestData.ExpectsThat(Result["records"].Quantity()).Equal(2);
+    
+    For Each Record In Result["records"] Do
+        ArrayOfDeletions.Add(Record["id"]);
+    EndDo;
+        
+    Result = OPI_Airtable.CreatePosts(Token, Base, Table, RowDescription1);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreatePosts (оdto)");
+    
+    SingleRecord = Result["id"];
+    OPI_GetTestData.ExpectsThat(SingleRecord).Filled();
+    OPI_GetTestData.ExpectsThat(Result["createdTime"]).Filled();
+    OPI_GetTestData.ExpectsThat(Result["fields"]["Number"]).Equal(Numeric);
+    OPI_GetTestData.ExpectsThat(ShortLP(Result["fields"]["String"])).Equal(StringType);
+  
+    Result = OPI_Airtable.GetRecord(Token, Base, Table, SingleRecord);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetRecord");
+    
+    OPI_GetTestData.ExpectsThat(Result["id"]).Equal(SingleRecord);
+    
+    Text     = "TestComment";
+    Result = OPI_Airtable.CreateComment(Token, Base, Table, SingleRecord, Text);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateComment");
+    
+    OPI_GetTestData.ExpectsThat(Result["text"]).Equal(Text);
+    
+    Comment   = Result["id"];
+    Text     = "TestComment (fromм.)";
+    Result = OPI_Airtable.EditComment(Token, Base, Table, SingleRecord, Comment, Text);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditComment");
+    
+    OPI_GetTestData.ExpectsThat(Result["text"]).Equal(Text);
+    
+    Result = OPI_Airtable.GetComments(Token, Base, Table, SingleRecord);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetComments");
+    
+    OPI_GetTestData.ExpectsThat(Result["comments"]).HasType("Array");
+    
+    Result = OPI_Airtable.DeleteComment(Token, Base, Table, SingleRecord, Comment);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteComment");
+    
+    OPI_GetTestData.ExpectsThat(Result["deleted"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["id"]).Equal(Comment);
+     
+    Result = OPI_Airtable.GetListOfRecords(Token, Base, Table);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetListOfRecords");
+    
+    OPI_GetTestData.ExpectsThat(Result["records"]).HasType("Array");
+    OPI_GetTestData.ExpectsThat(Result["records"]).Filled();
+    
+    Result = OPI_Airtable.DeletePosts(Token, Base, Table, ArrayOfDeletions);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeletePosts");
+    
+    OPI_GetTestData.ExpectsThat(Result["records"]).HasType("Array");
+    OPI_GetTestData.ExpectsThat(Result["records"]).Filled();
+      
+    Result = OPI_Airtable.DeletePosts(Token, Base, Table, SingleRecord);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeletePosts (оdto)");
+    
+    OPI_GetTestData.ExpectsThat(Result["records"]).HasType("Array");
+    OPI_GetTestData.ExpectsThat(Result["records"]).Filled();
+        
+EndProcedure
+
+#EndRegion
+
+#Region Dropbox
+
+Procedure Dropbox_GetUpdateToken() Export
+    
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Dropbox_Appkey"   , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Dropbox_Appsecret", TestParameters);
+   
+    Dropbox_GetAuthorizationLink(TestParameters); 
+    
+    OPI_GetTestData.ParameterToCollection("Dropbox_Code", TestParameters);
+
+    Dropbox_GetToken(TestParameters);
+    
+    OPI_GetTestData.ParameterToCollection("Dropbox_Refresh", TestParameters);
+    
+    Dropbox_UpdateToken(TestParameters);
+       
+EndProcedure
+
+Procedure Dropbox_UploadFile() Export
+    
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters);
+    OPI_GetTestData.ParameterToCollection("Picture", TestParameters);
+    
+    Dropbox_UploadFile(TestParameters);
+    Dropbox_GetObjectInformation(TestParameters);
+    Dropbox_GetObjectVersionList(TestParameters);
+    Dropbox_RestoreObjectToVersion(TestParameters);
+    Dropbox_GetPreview(TestParameters);
+    Dropbox_DownloadFile(TestParameters);
+    Dropbox_MoveObject(TestParameters);
+    Dropbox_CopyObject(TestParameters);
+    Dropbox_DeleteObject(TestParameters);
+        
+EndProcedure
+
+Procedure Dropbox_CreateFolder() Export
+    
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters);
+    
+    Dropbox_CreateFolder(TestParameters);
+    Dropbox_DownloadFolder(TestParameters);
+    
+EndProcedure
+
+Procedure Dropbox_GetFolderFileList() Export
+    
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters);
+    
+    Dropbox_GetFolderFileList(TestParameters);
+    
+EndProcedure
+
+Procedure Dropbox_UploadFileByURL() Export
+    
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters);
+    OPI_GetTestData.ParameterToCollection("Document", TestParameters);
+    
+    Dropbox_UploadFileByURL(TestParameters);
+    Dropbox_GetUploadStatusByURL(TestParameters);
+    
+EndProcedure
+
+Procedure Dropbox_CreateDeleteTag() Export
+    
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters);
+    
+    Dropbox_AddTag(TestParameters);
+    Dropbox_GetTagList(TestParameters);
+    Dropbox_DeleteTag(TestParameters);
+    
+EndProcedure
+
+Procedure Dropbox_GetAccount() Export
+  
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Dropbox_Token", TestParameters);
+    
+    Dropbox_GetAccountInformation(TestParameters);
+    Dropbox_GetSpaceUsageData(TestParameters);
+      
+EndProcedure
+
+Procedure Dropbox_AccessManagement() Export
+    
+    TestParameters = New Structure;
+    OPI_GetTestData.ParameterToCollection("Dropbox_Token"    , TestParameters);
+    OPI_GetTestData.ParameterToCollection("Dropbox_OtherUser", TestParameters);
+    OPI_GetTestData.ParameterToCollection("Dropbox_FileID"   , TestParameters);
+    
+    Dropbox_AddUsersToFile(TestParameters);
+    Dropbox_PublishFolder(TestParameters);
+    Dropbox_AddUsersToFolder(TestParameters);
+    Dropbox_CancelFolderPublication(TestParameters);
+    Dropbox_CancelFilePublication(TestParameters);
+    
+EndProcedure
+
+#EndRegion
+
+#EndRegion
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function GetVKParameters() 
+    
+    Parameters   = New Structure;
+    GroupNumber = OPI_GetTestData.GetParameter("VK_GroupID");
+    
+    Parameters.Insert("access_token"  , OPI_GetTestData.GetParameter("VK_Token"));
+    Parameters.Insert("owner_id"      , "-" + GroupNumber);
+    Parameters.Insert("app_id"        , OPI_GetTestData.GetParameter("VK_AppID"));
+    Parameters.Insert("group_id"      , GroupNumber);
+    
+    Return Parameters;
+    
+EndFunction
+
+Function GetTwitterParameters() 
+    
+    Parameters = New Match;
+              
+    Parameters.Insert("redirect_uri"          , OPI_GetTestData.GetParameter("Twitter_Redirect"));
+    Parameters.Insert("client_id"             , OPI_GetTestData.GetParameter("Twitter_ClinetID"));
+    Parameters.Insert("client_secret"         , OPI_GetTestData.GetParameter("Twitter_ClientSecret"));
+    Parameters.Insert("access_token"          , OPI_GetTestData.GetParameter("Twitter_Token"));
+    Parameters.Insert("refresh_token"         , OPI_GetTestData.GetParameter("Twitter_Refresh"));
+    Parameters.Insert("oauth_token"           , OPI_GetTestData.GetParameter("Twitter_OAuthToken"));
+    Parameters.Insert("oauth_token_secret"    , OPI_GetTestData.GetParameter("Twitter_OAuthSecret"));
+    
+    Parameters.Insert("oauth_consumer_key"    
+        , OPI_GetTestData.GetParameter("Twitter_OAuthConsumerKey"));
+    Parameters.Insert("oauth_consumer_secret" 
+        , OPI_GetTestData.GetParameter("Twitter_OAuthConsumerSecret"));
+
+    Return Parameters;
+    
+EndFunction
+
+#Region Checks
+
+Procedure Check_Empty(Val Result)   
+    OPI_GetTestData.ExpectsThat(ValueFilled(Result)).Equal(False);
+EndProcedure
+
+Procedure Check_BinaryData(Val Result, Val Size = Undefined)
+    
+    MinimumSize = 500000;
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("BinaryData"); 
+    
+    If Not Size = Undefined Then
+        OPI_GetTestData.ExpectsThat(Result.Size()).Equal(Size); 
+    Else
+        OPI_GetTestData.ExpectsThat(Result.Size() > MinimumSize).Equal(True);
+    EndIf;
+    
+EndProcedure
+
+Procedure Check_TelegramTrue(Val Result)
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]).Equal(True);
+        
+EndProcedure
+
+Procedure Check_TelegramBotInformation(Val Result)
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["username"]).Filled();
+    
+EndProcedure
+
+Procedure Check_TelegramArray(Result)
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match") .Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]).HasType("Array");
+    
+EndProcedure
+
+Procedure Check_TelegramWebhookSetup(Val Result)
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["description"]).Equal("Webhook was set");
+    
+EndProcedure
+
+Procedure Check_TelegramWebhookDeletion(Val Result)
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["description"]).Filled();
+    
+EndProcedure
+
+Procedure Check_TelegramMessage(Val Result, Val Text)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["text"]).Equal(Text);
+    	
+EndProcedure
+
+Procedure Check_TelegramImage(Val Result, Val Text)
+	
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match") .Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["caption"]).Equal(Text);
+    OPI_GetTestData.ExpectsThat(Result["result"]["photo"]).HasType("Array");
+        
+EndProcedure
+
+Procedure Check_TelegramVideo(Val Result, Val Text)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["caption"]).Equal(Text);
+    OPI_GetTestData.ExpectsThat(Result["result"]["video"]["mime_type"]).Equal("video/mp4");
+    	
+EndProcedure
+
+Procedure Check_TelegramAudio(Val Result, Val Text)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["caption"]).Equal(Text);
+    OPI_GetTestData.ExpectsThat(Result["result"]["audio"]["mime_type"]).Equal("audio/mpeg");
+            
+EndProcedure
+
+Procedure Check_TelegramDocument(Val Result, Val Text)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["caption"]).Equal(Text);
+    OPI_GetTestData.ExpectsThat(Result["result"]["document"]).HasType("Match").Filled();  
+      
+EndProcedure
+
+Procedure Check_TelegramGif(Val Result, Val Text)
+
+    Result = "result";
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result[Result]["caption"]).Equal(Text);
+    OPI_GetTestData.ExpectsThat(Result[Result]["document"]).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result[Result]["animation"]["mime_type"]).Equal("video/mp4");
+            
+EndProcedure
+
+Procedure Check_TelegramMediaGroup(Val Result)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]).HasType("Array");
+            
+EndProcedure
+
+Procedure Check_TelegramLocation(Val Result)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["location"]).HasType("Match").Filled();   
+     
+EndProcedure
+
+Procedure Check_TelegramContact(Val Result, Val Name)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["contact"]).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["result"]["contact"]["first_name"]).Equal(Name);
+            
+EndProcedure
+
+Procedure Check_TelegramPoll(Val Result, Val Question)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["poll"]).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["result"]["poll"]["question"]).Equal(Question);
+        	
+EndProcedure
+
+Procedure Check_TelegramForward(Val Result, Val MessageID)
+	
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["forward_origin"]["message_id"]).Equal(Number(MessageID));
+    
+EndProcedure
+
+Procedure Check_TelegramBan(Val Result)
+	
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["description"]).Equal("Bad Request: can't remove chat owner");
+    	
+EndProcedure
+
+Procedure Check_TelegramInvitation(Val Result, Val Title, Val UnixExpiration)
+
+    Result        = "result";
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result[Result]["member_limit"]).Equal(200);
+    OPI_GetTestData.ExpectsThat(Result[Result]["name"]).Equal(Title);
+    OPI_GetTestData.ExpectsThat(Result[Result]["expire_date"]).Equal(Number(UnixExpiration));
+    	
+EndProcedure
+
+Procedure Check_TelegramNumber(Val Result)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]).HasType("Number");
+    	
+EndProcedure
+
+Procedure Check_TelegramCreateTopic(Val Result, Val Name, Icon)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+    OPI_GetTestData.ExpectsThat(Result["result"]["name"]).Equal(Name);
+    OPI_GetTestData.ExpectsThat(Result["result"]["icon_custom_emoji_id"]).Equal(Icon);
+    	
+EndProcedure
+
+Procedure Check_VKPost(Val Result)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["response"]["post_id"]).HasType("Number").Filled();
+        
+EndProcedure
+
+Procedure Check_VKTrue(Val Result)
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["response"]).HasType("Number").Equal(1);
+    
+EndProcedure
+
+Procedure Check_VKAlbum(Val Result, Val Description)
+
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["response"]["description"]).Equal(Description);
+        
+EndProcedure
+
+Procedure Check_VKAlbumPicture(Val Result, Val ImageDescription, Val AlbumID)
+
+    Response    = "response";
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result[Response][0]["text"]).Equal(ImageDescription);
+    OPI_GetTestData.ExpectsThat(Result[Response][0]["album_id"]).Equal(AlbumID);
+            
+EndProcedure
+
+Procedure Check_VKStory(Val Result)
+  
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["response"]["count"]).HasType("Number").Equal(1);
+    OPI_GetTestData.ExpectsThat(Result["response"]["items"]).HasType("Array").Filled();
+      
+EndProcedure
+
+Procedure Check_VKDiscussion(Val Result)
+ 
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["response"]).HasType("Number").Filled();   
+    
+EndProcedure
+
+Procedure Check_GKObject(Val Result, Val Name, Val Description)
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match");
+    OPI_GetTestData.ExpectsThat(Result["summary"]).Equal(Name);
+    OPI_GetTestData.ExpectsThat(Result["description"]).Equal(Description);
+    OPI_GetTestData.ExpectsThat(Result["id"]).HasType("String").Filled();
+    
+EndProcedure
+
+Procedure Check_TwitterText(Val Result, Val Text)
+    
+    ReplyText = Result["data"]["text"];
+    ReplyText = Left(ReplyText, StrLength(Text));
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(ReplyText).Equal(Text);
+
+EndProcedure
+
+Procedure Check_ViberOk(Val Result)
+    
+    OPI_GetTestData.ExpectsThat(Result["status_message"]).Equal("ok");
+    OPI_GetTestData.ExpectsThat(Result["status"]).Equal(0);
+
+EndProcedure
+
+Procedure Check_NotionObject(Val Result, Val View = "page")
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["object"]).Equal(View);
+    
+EndProcedure
+
+Procedure Check_SlackOk(Val Result)
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    OPI_GetTestData.ExpectsThat(Result["ok"]).Equal(True);
+
+EndProcedure
+
+Procedure Check_DropboxFile(Val Result, Val Path)
+    
+    OPI_GetTestData.ExpectsThat(Result["path_display"]).Equal(Path);
+    
+EndProcedure
+
+Procedure Check_DropboxMetadata(Val Result, Val Path)
+    
+    OPI_GetTestData.ExpectsThat(Result["metadata"]["path_display"]).Equal(Path);
+    
+EndProcedure
+
+Procedure Check_DropboxArray(Val Result, Val Quantity = Undefined)
+    
+    OPI_GetTestData.ExpectsThat(Result["entries"]).HasType("Array");
+    
+    If Not Quantity = Undefined Then
+        OPI_GetTestData.ExpectsThat(Result["entries"].Quantity()).Equal(Quantity);
+    EndIf;
+    
+EndProcedure
+
+Procedure Check_DropboxWork(Val Result)
+    OPI_GetTestData.ExpectsThat(Result["async_job_id"]).Filled();
+EndProcedure
+
+Procedure Check_DropboxStatus(Val Result)
+    OPI_GetTestData.ExpectsThat(Result[".tag"]).Equal("complete");
+EndProcedure
+
+Procedure Check_DropboxTags(Val Result, Val Quantity)
+    
+    OPI_GetTestData.ExpectsThat(Result["paths_to_tags"]).HasType("Array");
+    OPI_GetTestData.ExpectsThat(Result["paths_to_tags"].Quantity()).Equal(Quantity);
+    
+EndProcedure
+
+Procedure Check_DropboxAccount(Val Result)
+    OPI_GetTestData.ExpectsThat(Result["account_id"]).Filled();
+EndProcedure
+
+Procedure Check_DropboxSpace(Val Result)
+    OPI_GetTestData.ExpectsThat(Result["used"]).Filled();
+EndProcedure
+
+Procedure Check_DropboxMember(Val Result, Val Email, Val ViewOnly)
+    OPI_GetTestData.ExpectsThat(Result[0]["result"][".tag"]).Equal("success");
+    OPI_GetTestData.ExpectsThat(Result[0]["member"]["email"]).Equal(Email);
+    OPI_GetTestData.ExpectsThat(
+        Result[0]["result"]["success"][".tag"]).Equal(?(ViewOnly, "viewer", "editor"));
+EndProcedure
+
+Procedure Check_DropboxPublicFolder(Val Result)
+    OPI_GetTestData.ExpectsThat(Result["shared_folder_id"]).Filled();
+EndProcedure
+
+#EndRegion
+
+#Region AtomicTests
+
+#Region Telegram
+
+Procedure Telegram_GetBotInformation(FunctionParameters)
+
+    Token       = FunctionParameters["Telegram_Token"];
+    Result   = OPI_Telegram.GetBotInformation(Token);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetBotInformation", "Telegram");
+        
+    Check_TelegramBotInformation(Result);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_GetUpdates(FunctionParameters)
+	
+	Token       = FunctionParameters["Telegram_Token"];
+    Result   = OPI_Telegram.GetUpdates(Token);
+
+	// END
+	
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetUpdates", "Telegram");
+    
+    Check_TelegramArray(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Telegram_SetWebhook(FunctionParameters)
+    
+    Token       = FunctionParameters["Telegram_Token"];
+    URL         = FunctionParameters["Telegram_URL"];
+    
+    Result   = OPI_Telegram.SetWebhook(Token, URL);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SetWebhook", "Telegram");
+      
+    Check_TelegramWebhookSetup(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Telegram_DeleteWebhook(FunctionParameters)
+	
+	Token     = FunctionParameters["Telegram_Token"];
+	Result = OPI_Telegram.DeleteWebhook(Token);
+	
+	// END
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "DeleteWebhook", "Telegram");
+      
+    Check_TelegramWebhookDeletion(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Telegram_SendTextMessage(FunctionParameters)
+	
+	Token    = FunctionParameters["Telegram_Token"];
+	ChatID   = FunctionParameters["Telegram_ChatID"];
+	ChannelID = FunctionParameters["Telegram_ChannelID"];    
+	Text    = FunctionParameters["String"];
+	
+    Result = OPI_Telegram.SendTextMessage(Token, ChatID, Text);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage", "Telegram"); 
+    
+    Check_TelegramMessage(Result, Text); // SKIP
+    
+    Result = OPI_Telegram.SendTextMessage(Token, ChannelID, Text);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage (toаtoл)"); 
+    
+    Check_TelegramMessage(Result, Text);
+    
+    MessageID = OPI_Tools.NumberToString(Result["result"]["message_id"]);
+    OPI_GetTestData.WriteParameter("Telegram_ChannelMessageID", MessageID);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Telegram_SendPicture(FunctionParameters)
+
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    ChannelID = FunctionParameters["Telegram_ChannelID"];
+    Text    = FunctionParameters["String"];
+    Image = FunctionParameters["Picture"]; 
+    
+    ImagePath = GetTempFileName("png");
+    CopyFile(Image, ImagePath);
+    
+    ImageDD   = New BinaryData(ImagePath);
+    
+    Result = OPI_Telegram.SendImage(Token, ChatID, Text, Image);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendImage", "Telegram");
+    
+    Check_TelegramImage(Result, Text); // SKIP
+  
+    Result = OPI_Telegram.SendImage(Token, ChannelID, Text, ImagePath);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendImage (Path)");
+    
+    Check_TelegramImage(Result, Text); // SKIP
+      
+    Result = OPI_Telegram.SendImage(Token, ChannelID, Text, ImageDD);
+    
+    // END 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendImage (BD)");
+    
+    Check_TelegramImage(Result, Text);
+    
+    DeleteFiles(ImagePath);
+    
+    FileID = Result["result"]["photo"][0]["file_id"];
+    OPI_GetTestData.WriteParameter("Telegram_FileID", FileID);
+    
+    FunctionParameters.Insert("Telegram_FileID", FileID);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_SendVideo(FunctionParameters)
+
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    ChannelID = FunctionParameters["Telegram_ChannelID"];
+    Text    = FunctionParameters["String"];
+    Video    = FunctionParameters["Video"];
+    
+    VideoPath = GetTempFileName("mp4");
+    CopyFile(Video, VideoPath);
+    
+    VideoDD   = New BinaryData(VideoPath);
+    
+    Result = OPI_Telegram.SendVideo(Token, ChatID, Text, Video);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendVideo", "Telegram");
+    
+    Check_TelegramVideo(Result, Text); // SKIP
+  
+    Result = OPI_Telegram.SendVideo(Token, ChannelID, Text, VideoPath);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendVideo (Path)");
+    
+    Check_TelegramVideo(Result, Text); // SKIP
+      
+    Result = OPI_Telegram.SendVideo(Token, ChannelID, Text, VideoDD);
+    
+    // END 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendVideo (BD)");
+    
+    Check_TelegramVideo(Result, Text);
+    
+    DeleteFiles(VideoPath);
+    
+    FileID = Result["result"]["video"]["file_id"];
+    OPI_GetTestData.WriteParameter("Telegram_FileID", FileID);
+    
+    FunctionParameters.Insert("Telegram_FileID", FileID);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_SendAudio(FunctionParameters)
+
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    ChannelID = FunctionParameters["Telegram_ChannelID"];
+    Text    = FunctionParameters["String"];
+    Audio    = FunctionParameters["Audio"];
+    
+    AudioPath = GetTempFileName("mp3");
+    CopyFile(Audio, AudioPath);
+    
+    AudioDD   = New BinaryData(AudioPath);
+    
+    Result = OPI_Telegram.SendAudio(Token, ChatID, Text, Audio);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendAudio", "Telegram");
+    
+    Check_TelegramAudio(Result, Text); // SKIP
+  
+    Result = OPI_Telegram.SendAudio(Token, ChannelID, Text, AudioPath);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendAudio (Path)");
+    
+    Check_TelegramAudio(Result, Text); // SKIP
+      
+    Result = OPI_Telegram.SendAudio(Token, ChannelID, Text, AudioDD);
+    
+    // END 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendAudio (BD)");
+    
+    Check_TelegramAudio(Result, Text);
+    
+    DeleteFiles(AudioPath);
+    
+    FileID = Result["result"]["audio"]["file_id"];
+    OPI_GetTestData.WriteParameter("Telegram_FileID", FileID);
+    
+    FunctionParameters.Insert("Telegram_FileID", FileID);
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure Telegram_SendDocument(FunctionParameters)
+
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    ChannelID = FunctionParameters["Telegram_ChannelID"];
+    Text    = FunctionParameters["String"];
+    Document = FunctionParameters["Document"];
+    
+    DocumentPath = GetTempFileName("docx");
+    CopyFile(Document, DocumentPath);
+    
+    DocumentDD   = New BinaryData(DocumentPath);
+    
+    Result = OPI_Telegram.SendDocument(Token, ChatID, Text, Document);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendDocument", "Telegram");
+    
+    Check_TelegramDocument(Result, Text); // SKIP
+  
+    Result = OPI_Telegram.SendDocument(Token, ChannelID, Text, DocumentPath);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendDocument (Path)");
+    
+    Check_TelegramDocument(Result, Text); // SKIP
+      
+    Result = OPI_Telegram.SendDocument(Token, ChannelID, Text, DocumentDD);
+    
+    // END 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendDocument (BD)");
+    
+    Check_TelegramDocument(Result, Text);
+    
+    DeleteFiles(DocumentPath);
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure Telegram_SendGif(FunctionParameters)
+
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    ChannelID = FunctionParameters["Telegram_ChannelID"];
+    Text    = FunctionParameters["String"];
+    GIF    = FunctionParameters["GIF"];
+    
+    GifPath = GetTempFileName("gif");
+    CopyFile(GIF, GifPath);
+    
+    GifDD   = New BinaryData(GifPath);
+    
+    Result = OPI_Telegram.SendGif(Token, ChatID, Text, GIF);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendGif", "Telegram");
+    
+    Check_TelegramGif(Result, Text); // SKIP
+  
+    Result = OPI_Telegram.SendGif(Token, ChannelID, Text, GifPath);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendGif (Path)");
+    
+    Check_TelegramGif(Result, Text); // SKIP
+      
+    Result = OPI_Telegram.SendGif(Token, ChannelID, Text, GifDD);
+    
+    // END 
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendGif (BD)");
+    
+    Check_TelegramGif(Result, Text);
+    
+    DeleteFiles(GifPath);
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure Telegram_SendMediaGroup(FunctionParameters)
+
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    Text    = FunctionParameters["String"];
+    Image = FunctionParameters["Picture"];
+    Video    = FunctionParameters["Video"];
+ 
+    ImagePath = GetTempFileName("png");
+    CopyFile(Image, ImagePath);
+           
+    VideoPath = GetTempFileName("mp4");
+    CopyFile(Video, VideoPath);
+    
+    VideoDD   = New BinaryData(VideoPath);
+    
+    MediaGroup    = New Match;
+    MediaGroup.Insert(ImagePath, "photo");
+    MediaGroup.Insert(VideoDD     , "video");
+    
+    Result = OPI_Telegram.SendMediaGroup(Token, ChatID, Text, MediaGroup);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendMediaGroup", "Telegram");
+    
+    Check_TelegramMediaGroup(Result); 
+   
+    DeleteFiles(VideoPath);
+    DeleteFiles(ImagePath);
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure Telegram_SendLocation(FunctionParameters)
+    
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    ChannelID = FunctionParameters["Telegram_ChannelID"];    
+    Width   = FunctionParameters["Lat"];
+    Longitude  = FunctionParameters["Long"];
+    
+    Result = OPI_Telegram.SendLocation(Token, ChatID, Width, Longitude);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendLocation", "Telegram"); 
+    
+    Check_TelegramLocation(Result); // SKIP
+    
+    Result = OPI_Telegram.SendLocation(Token, ChannelID, Width, Longitude);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendLocation (toаtoл)"); 
+    
+    Check_TelegramLocation(Result);
+
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Telegram_SendContact(FunctionParameters)
+
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    ChannelID = FunctionParameters["Telegram_ChannelID"];    
+    Name      = FunctionParameters["Name"];
+    Last name  = FunctionParameters["Surname"];
+    Phone  = FunctionParameters["Phone"];
+    
+    Result = OPI_Telegram.SendContact(Token, ChatID  , Name, Last name, Phone);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendContact", "Telegram"); 
+    
+    Check_TelegramContact(Result, Name); // SKIP
+    OPI_Tools.Pause(20);                // SKIP
+    
+    Result = OPI_Telegram.SendContact(Token, ChannelID, Name, Last name, Phone);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendContact (toаtoл)"); 
+    
+    Check_TelegramContact(Result, Name);
+
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure Telegram_SendPoll(FunctionParameters)
+
+    Token    = FunctionParameters["Telegram_Token"];
+    ChatID   = FunctionParameters["Telegram_ChatID"];
+    ChannelID = FunctionParameters["Telegram_ChannelID"]; 
+    Question   = "What's your favorite color?";
+    
+    AnswersArray     = New Array;
+    AnswersArray.Add("Red");
+    AnswersArray.Add("Yellow");
+    AnswersArray.Add("Green");
+    AnswersArray.Add("Blue");
+    
+    Result = OPI_Telegram.SendPoll(Token, ChatID  , Question, AnswersArray, False);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendPoll", "Telegram");
+                
+    Check_TelegramPoll(Result, Question); // SKIP
+    
+    Result = OPI_Telegram.SendPoll(Token, ChannelID, Question, AnswersArray, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendPoll (toаtoл)");
+                
+    Check_TelegramPoll(Result, Question); // SKIP
+    
+    // END
+    
+    StringArray    = "['Red', 'Yellow','Green' ,'Blue']";
+    
+    Result = OPI_Telegram.SendPoll(Token, ChannelID, Question, StringArray, True);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendPoll (withтрочный маwithwithиin)");
+                
+    Check_TelegramPoll(Result, Question);
+
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_DownloadFile(FunctionParameters)
+	
+	FileID = FunctionParameters["Telegram_FileID"];
+	Token   = FunctionParameters["Telegram_Token"];
+
+    Result = OPI_Telegram.DownloadFile(Token, FileID);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DownloadFile", "Telegram");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("BinaryData");
+    	
+EndProcedure
+
+Procedure Telegram_ForwardMessage(FunctionParameters)
+
+    Token       = FunctionParameters["Telegram_Token"];
+    ChatID      = FunctionParameters["Telegram_ChatID"];
+    ChannelID    = FunctionParameters["Telegram_ChannelID"];
+    MessageID = FunctionParameters["Telegram_ChannelMessageID"];
+    
+    Result = OPI_Telegram.ForwardMessage(Token, MessageID, ChannelID, ChatID);
+    
+    // END
+
+    // !OInt OPI_GetTestData.WriteLog(Result, "ForwardMessage", "Telegram");
+        
+	Check_TelegramForward(Result, MessageID);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_Ban(FunctionParameters)
+	
+	Token          = FunctionParameters["Telegram_Token"];
+    UserID = FunctionParameters["Telegram_ChatID"];
+    ChannelID       = FunctionParameters["Telegram_ChannelID"];
+    
+	Result = OPI_Telegram.Ban(Token, ChannelID, UserID);
+
+	// END
+	
+    // !OInt OPI_GetTestData.WriteLog(Result, "Ban", "Telegram");
+    
+	Check_TelegramBan(Result);
+	OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Telegram_Unban(FunctionParameters)
+	
+    Token          = FunctionParameters["Telegram_Token"];
+    UserID = FunctionParameters["Telegram_ChatID"];
+    ChannelID       = FunctionParameters["Telegram_ChannelID"];
+    
+	Result = OPI_Telegram.Unban(Token, ChannelID, UserID);
+
+	// END
+	
+    // !OInt OPI_GetTestData.WriteLog(Result, "Unban", "Telegram");
+    
+	Check_TelegramBan(Result);
+	OPI_Tools.Pause(5);
+	
+EndProcedure
+
+Procedure Telegram_CreateInviteLink(FunctionParameters)
+
+    Token         = FunctionParameters["Telegram_Token"];
+    ChannelID      = FunctionParameters["Telegram_ChannelID"];    
+    Day         = 86400;   
+    CurrentDate   = OPI_Tools.GetCurrentDate();
+
+    Title     = "Link " + String(CurrentDate); 
+    Expiration     = CurrentDate + Day;
+    UnixExpiration = OPI_Tools.UNIXTime(Expiration);
+    
+    Result = OPI_Telegram.CreateInvitationLink(Token, ChannelID, Title, Expiration, 200);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateInvitationLink", "Telegram");
+
+	Check_TelegramInvitation(Result, Title, UnixExpiration);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_PinMessage(FunctionParameters)
+
+    Token       = FunctionParameters["Telegram_Token"];
+    ChannelID    = FunctionParameters["Telegram_ChannelID"];
+    MessageID = FunctionParameters["Telegram_ChannelMessageID"];
+    
+    Result = OPI_Telegram.PinMessage(Token, ChannelID, MessageID);
+
+	// END
+	
+    // !OInt OPI_GetTestData.WriteLog(Result, "PinMessage", "Telegram");
+	
+	Check_TelegramTrue(Result);
+        
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_UnpinMessage(FunctionParameters)
+
+    Token       = FunctionParameters["Telegram_Token"];
+    ChannelID    = FunctionParameters["Telegram_ChannelID"];
+    MessageID = FunctionParameters["Telegram_ChannelMessageID"];
+    
+    Result = OPI_Telegram.UnpinMessage(Token, ChannelID, MessageID);
+
+	// END
+	
+    // !OInt OPI_GetTestData.WriteLog(Result, "UnpinMessage", "Telegram");
+	
+	Check_TelegramTrue(Result);
+        
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_GetParticipantCount(FunctionParameters)
+	
+    Token       = FunctionParameters["Telegram_Token"];
+    ChannelID    = FunctionParameters["Telegram_ChannelID"];
+    
+    Result  = OPI_Telegram.GetParticipantCount(Token, ChannelID);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetParticipantCount", "Telegram");
+    
+    Check_TelegramNumber(Result);
+        
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_GetForumAvatarList(FunctionParameters)
+	
+	Token       = FunctionParameters["Telegram_Token"];
+	Result   = OPI_Telegram.GetAvatarIconList(Token);
+	
+	// END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetAvatarIconList", "Telegram");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("Match").Filled();
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Telegram_CreateForumTopic(FunctionParameters)
+	
+	Token  = FunctionParameters["Telegram_Token"];
+    Chat    = FunctionParameters["Telegram_ForumID"];
+    Icon = "5357419403325481346";
+    Name    = "TestTopic " + String(New UniqueIdentifier);
+    
+	Result = OPI_Telegram.CreateForumThread(Token, Chat, Name, Icon);
+	
+	// END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateForumThread", "Telegram");
+    
+    Topic = Result["result"]["message_thread_id"];
+    
+    FunctionParameters.Insert("Telegram_TopicID", Topic);
+    OPI_Tools.AddField("Telegram_TopicID", Topic, "String", FunctionParameters);
+    OPI_GetTestData.WriteParameter("Telegram_TopicID", FunctionParameters["Telegram_TopicID"]);
+   
+	Check_TelegramCreateTopic(Result, Name, Icon);
+	
+	ChatTopic   = Chat + "*" + Topic;
+	Text     = FunctionParameters["String"];
+    Result = OPI_Telegram.SendTextMessage(Token, ChatTopic, Text);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SendTextMessage (форум)");
+    
+    Check_TelegramMessage(Result, Text);
+	
+EndProcedure
+
+Procedure Telegram_EditForumTopic(FunctionParameters)
+
+	Token       = FunctionParameters["Telegram_Token"];
+    Chat         = FunctionParameters["Telegram_ForumID"];
+    Topic        = FunctionParameters["Telegram_TopicID"];
+    NewName    = "NewTestTitle";
+    NewIcon  = "5310132165583840589";
+
+    Result = OPI_Telegram.EditForumTopic(Token, Chat, Topic, NewName, NewIcon);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditForumTopic", "Telegram");
+        
+    Check_TelegramTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_CloseForumTopic(FunctionParameters)
+
+	Token       = FunctionParameters["Telegram_Token"];
+    Chat         = FunctionParameters["Telegram_ForumID"];
+    Topic        = FunctionParameters["Telegram_TopicID"];
+
+    OPI_Telegram.OpenForumThread(Token, Chat); // SKIP
+    
+	Result = OPI_Telegram.CloseForumThread(Token, Chat);       // Closes main topic
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "CloseForumThread (глаintoя)");
+    
+    Check_TelegramTrue(Result); // SKIP
+    
+    Result = OPI_Telegram.CloseForumThread(Token, Chat, Topic);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CloseForumThread", "Telegram");
+    
+    Check_TelegramTrue(Result);
+    
+    OPI_Tools.Pause(25);
+    	
+EndProcedure
+
+Procedure Telegram_OpenForumTopic(FunctionParameters)
+
+	Token       = FunctionParameters["Telegram_Token"];
+    Chat         = FunctionParameters["Telegram_ForumID"];
+    Topic        = FunctionParameters["Telegram_TopicID"];
+
+	Result = OPI_Telegram.OpenForumThread(Token, Chat);       // Opens main topic
+	
+	// !OInt OPI_GetTestData.WriteLog(Result, "OpenForumThread (глаintoя)");
+    
+    Check_TelegramTrue(Result); // SKIP
+    
+    Result = OPI_Telegram.OpenForumThread(Token, Chat, Topic);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "OpenForumThread", "Telegram");
+    
+    Check_TelegramTrue(Result);
+    
+    OPI_Tools.Pause(25);
+    	
+EndProcedure
+
+Procedure Telegram_DeleteForumTopic(FunctionParameters)
+
+	Token       = FunctionParameters["Telegram_Token"];
+    Chat         = FunctionParameters["Telegram_ForumID"];
+    Topic        = FunctionParameters["Telegram_TopicID"];
+    
+    Result = OPI_Telegram.DeleteForumTopic(Token, Chat, Topic); 
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteForumTopic", "Telegram");
+    
+    Check_TelegramTrue(Result);
+    
+    OPI_Tools.Pause(25);
+    	
+EndProcedure
+
+Procedure Telegram_ClearPinnedMessagesList(FunctionParameters)
+
+	Token       = FunctionParameters["Telegram_Token"];
+    Chat         = FunctionParameters["Telegram_ForumID"];
+    Topic        = FunctionParameters["Telegram_TopicID"];
+    
+    Result = OPI_Telegram.ClearThreadPinnedMessagesList(Token, Chat);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ClearThreadPinnedMessagesList (глаintoя)");
+    
+    Check_TelegramTrue(Result); // SKIP
+    
+    Result = OPI_Telegram.ClearThreadPinnedMessagesList(Token, Chat, Topic);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ClearThreadPinnedMessagesList", "Telegram");
+    
+    Check_TelegramTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_HideMainForumTopic(FunctionParameters)
+
+	Token       = FunctionParameters["Telegram_Token"];
+    Chat         = FunctionParameters["Telegram_ForumID"];
+    
+    Result = OPI_Telegram.HideMainForumTopic(Token, Chat);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "HideMainForumTopic", "Telegram");
+    
+    Check_TelegramTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_ShowMainForumTopic(FunctionParameters)
+
+	Token       = FunctionParameters["Telegram_Token"];
+    Chat         = FunctionParameters["Telegram_ForumID"];
+    
+    Result = OPI_Telegram.ShowMainForumTopic(Token, Chat);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "ShowMainForumTopic", "Telegram");
+    
+    Check_TelegramTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+Procedure Telegram_ChangeMainTopicName(FunctionParameters)
+
+	Title   = "New main thread name " + String(New UniqueIdentifier);
+	Token       = FunctionParameters["Telegram_Token"];
+    Chat         = FunctionParameters["Telegram_ForumID"];    
+	
+    Result = OPI_Telegram.EditMainForumTopicName(Token, Chat, Title);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "EditMainForumTopicName", "Telegram");
+    
+    Check_TelegramTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    	
+EndProcedure
+
+#EndRegion
+
+#Region VK
+
+Procedure VK_CreateTokenRetrievalLink(FunctionParameters)
+
+    Application = FunctionParameters["VK_AppID"];
+    Result  = OPI_VK.CreateTokenRetrievalLink(Application);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateTokenRetrievalLink", "VK");
+    
+    OPI_GetTestData.ExpectsThat(Result).HasType("String").Filled();
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure VK_CreatePost(FunctionParameters)
+    
+    Parameters = GetVKParameters();
+    Text     = "Post from autotest";
+    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
+    
+    Image  = FunctionParameters["Picture"];  // URL, Path or Binary Data
+    Image2 = FunctionParameters["Picture2"]; // URL, Path or Binary Data
+    
+    AndVF = GetTempFileName("png");   
+    CopyFile(Image2, AndVF);
+    
+    ImageArray = New Array;
+    ImageArray.Add(Image);
+    ImageArray.Add(AndVF);
+  
+    Result = OPI_VK.CreatePost(Text, ImageArray, True, URL, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreatePost", "VK");
+
+    Check_VKPost(Result);                         // SKIP
+    PostID   = Result["response"]["post_id"];       // SKIP
+    Result = OPI_VK.DeletePost(PostID, Parameters); // SKIP
+    
+    Result = OPI_VK.CreatePost(Text, Image, False  ,    , Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreatePost (оdto toартинtoа)");
+
+    Check_VKPost(Result); 
+    
+    PostID   = Result["response"]["post_id"];       
+    Result = OPI_VK.DeletePost(PostID, Parameters); 
+    
+    OPI_Tools.Pause(5);   
+    
+    Result = OPI_VK.CreatePost(Text, AndVF     , True, URL, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreatePost (оdин path)");
+
+    Check_VKPost(Result);                   
+    
+    PostID = Result["response"]["post_id"];
+    OPI_Tools.AddField("VK_PostID", PostID, "String", FunctionParameters);
+    OPI_GetTestData.WriteParameter("VK_PostID", FunctionParameters["VK_PostID"]);
+    
+    DeleteFiles(AndVF);
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_DeletePost(FunctionParameters)
+    
+    Parameters = GetVKParameters();
+    PostID   = FunctionParameters["VK_PostID"];
+    
+    Result = OPI_VK.DeletePost(PostID, Parameters);
+
+    // END
+
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeletePost", "VK");
+            
+    Check_VKTrue(Result);
+    
+EndProcedure
+
+Procedure VK_CreateCompositePost(FunctionParameters)
+
+    Parameters = GetVKParameters();
+    Text     = "Post from autotest";
+    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
+    
+    Image = FunctionParameters["Picture"]; // URL, Path or Binary Data
+    Video    = FunctionParameters["Video"];   // URL, Path or Binary Data
+    
+    AndVF = GetTempFileName("png");   
+    CopyFile(Image, AndVF);
+    
+    ImageUpload = OPI_VK.UploadPhotoToServer(AndVF, Parameters)["response"][0];
+    VideoUpload    = OPI_VK.UploadVideoToServer(Video, "NewVideo", , , Parameters);
+    
+    ImageOwner = OPI_Tools.NumberToString(ImageUpload["owner_id"]);
+    VideoOwner    = OPI_Tools.NumberToString(VideoUpload["owner_id"]);
+    
+    ImageID       = OPI_Tools.NumberToString(ImageUpload["id"]);
+    VideoID          = OPI_Tools.NumberToString(VideoUpload["video_id"]);
+    
+    AttachmentsArray = New Array;
+    AttachmentsArray.Add("photo" + ImageOwner + "_" + ImageID);
+    AttachmentsArray.Add("video" + VideoOwner + "_" + VideoID);
+    
+    Result = OPI_VK.CreateCompositePost(Text, AttachmentsArray, False, URL, Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateCompositePost", "VK");
+    
+    Check_VKPost(Result);
+    DeleteFiles(AndVF);    
+        
+    OPI_Tools.Pause(5);
+     
+EndProcedure
+
+Procedure VK_CreatePoll()
+
+    Parameters = GetVKParameters();
+    Question    = "What's your favorite color?";
+    
+    OptionArray = New Array;
+    OptionArray.Add("Red");
+    OptionArray.Add("Yellow");
+    OptionArray.Add("Green");
+    
+    Result = OPI_VK.CreatePoll(Question, OptionArray, , Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreatePoll", "VK");
+    
+    Check_VKPost(Result);
+        
+    PostID  = Result["response"]["post_id"];
+    OPI_VK.DeletePost(PostID, Parameters);
+    
+    OPI_Tools.Pause(10);
+        
+EndProcedure
+
+Procedure VK_CreateAlbum(FunctionParameters)
+    
+    Parameters        = GetVKParameters();
+    Name              = "AlbumFromAutoTest";
+    Description         = "NewAlbumFromAutoTest";
+      
+    Result = OPI_VK.CreateAlbum(Name, Description, Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateAlbum", "VK");
+    
+    Check_VKAlbum(Result, Description);
+        
+    AlbumID  = Result["response"]["id"];
+    FunctionParameters.Insert("VK_AlbumID", AlbumID);
+    OPI_GetTestData.WriteParameter("VK_AlbumID", AlbumID);
+    
+EndProcedure
+
+Procedure VK_SavePictureToAlbum(FunctionParameters)
+    
+    Parameters        = GetVKParameters();
+    ImageDescription = "AutoTestImage";
+    AlbumID        = FunctionParameters["VK_AlbumID"];
+    
+    Image  = FunctionParameters["Picture"];       // URL, Path to file or Binary Data
+    AndVF       = GetTempFileName("png");
+    CopyFile(Image, AndVF);
+    
+    Image  = New BinaryData(AndVF);
+    
+    Result = OPI_VK.SaveImageToAlbum(AlbumID, Image, ImageDescription, Parameters);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "SaveImageToAlbum", "VK");
+    
+    Check_VKAlbumPicture(Result, ImageDescription, AlbumID); // SKIP
+    
+    ImageID  = Result["response"][0]["id"];                       // SKIP
+    Result    = OPI_VK.DeleteImage(ImageID, Parameters);       // SKIP
+            
+    Result = OPI_VK.SaveImageToAlbum(AlbumID, AndVF, ImageDescription, Parameters);
+    
+    // END
+   
+    // !OInt OPI_GetTestData.WriteLog(Result, "SaveImageToAlbum (path)");
+    
+    Check_VKAlbumPicture(Result, ImageDescription, AlbumID); // SKIP
+    
+    ImageID  = Result["response"][0]["id"];
+    FunctionParameters.Insert("VK_PictureID", ImageID);
+    OPI_GetTestData.WriteParameter("VK_PictureID", ImageID);
+    
+    DeleteFiles(AndVF);
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_DeleteImage(FunctionParameters)
+    
+    Parameters  = GetVKParameters();
+    ImageID = FunctionParameters["VK_PictureID"];
+    
+    Result  = OPI_VK.DeleteImage(ImageID, Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteImage", "VK");
+    
+    Check_VKTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_DeleteAlbum(FunctionParameters)
+    
+    Parameters = GetVKParameters();
+    AlbumID = FunctionParameters["VK_AlbumID"];
+    
+    Result = OPI_VK.DeleteAlbum(AlbumID, Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteAlbum", "VK");
+        
+    Check_VKTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_CreateStory(FunctionParameters)
+
+    Parameters = GetVKParameters();
+    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
+
+    Image  = FunctionParameters["Picture"];       // URL, Path to file or Binary Data
+    AndVF       = GetTempFileName("png");
+    CopyFile(Image, AndVF);
+    Image  = New BinaryData(AndVF);
+       
+    Result = OPI_VK.CreateStory(Image , URL, Parameters);
+
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateStory", "VK");
+    
+    Check_VKStory(Result); // SKIP
+        
+    Result = OPI_VK.CreateStory(AndVF, , Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateStory (path)");
+    
+    Check_VKStory(Result);
+    
+    DeleteFiles(AndVF);
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure VK_CreateDiscussion(FunctionParameters)
+
+    Parameters       = GetVKParameters();
+    Name        = "Discussing: Which color is better?";
+    Message       = "Red, yellow, blue, or some other?";
+    
+    Result = OPI_VK.CreateDiscussion(Name, Message, Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateDiscussion", "VK");
+    
+    Check_VKDiscussion(Result);
+    
+    DiscussionID = Result["response"];
+    FunctionParameters.Insert("VK_ConvID", DiscussionID);
+    OPI_GetTestData.WriteParameter("VK_ConvID", DiscussionID);    
+    
+    OPI_Tools.Pause(5);
+        
+EndProcedure
+
+Procedure VK_CloseDiscussion(FunctionParameters)
+    
+    Parameters    = GetVKParameters();
+    DiscussionID = FunctionParameters["VK_ConvID"];
+    Result    = OPI_VK.CloseDiscussion(DiscussionID, False, Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CloseDiscussion", "VK");
+        
+    Check_VKTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_OpenDiscussion(FunctionParameters)
+    
+    Parameters    = GetVKParameters();
+    DiscussionID = FunctionParameters["VK_ConvID"];
+    Result    = OPI_VK.OpenDiscussion(DiscussionID, Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "OpenDiscussion", "VK");
+        
+    Check_VKTrue(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure VK_PostToDiscussion(FunctionParameters)
+    
+    Parameters    = GetVKParameters();
+    DiscussionID = FunctionParameters["VK_ConvID"];
+    Message    = "I like yellow more";
+    
+    Result = OPI_VK.WriteInDiscussion(DiscussionID, Message, Parameters);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "WriteInDiscussion", "VK");
+    
+    Check_VKDiscussion(Result);
+    
+EndProcedure
+
+#EndRegion
+
+#Region Dropbox
+
+Procedure Dropbox_GetAuthorizationLink(FunctionParameters)
+
+    AppKey = FunctionParameters["Dropbox_Appkey"];
+    Result      = OPI_Dropbox.GetAuthorizationLink(AppKey);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetAuthorizationLink", "Dropbox");
+        
+    OPI_GetTestData.ExpectsThat(Result).HasType("String");
+    
+EndProcedure
+
+Procedure Dropbox_GetToken(FunctionParameters)
+    
+    AppKey   = FunctionParameters["Dropbox_Appkey"];
+    AppSecret = FunctionParameters["Dropbox_Appsecret"];
+    Code              = FunctionParameters["Dropbox_Code"];
+
+    Result = OPI_Dropbox.GetToken(AppKey, AppSecret, Code);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetToken");
+    
+    Token  = Result["access_token"];
+    Refresh = Result["refresh_token"];
+   
+    If ValueFilled(Token) Then
+        OPI_GetTestData.WriteParameter("Dropbox_Token", Token);
+    EndIf;
+   
+    If ValueFilled(Refresh) Then
+        OPI_GetTestData.WriteParameter("Dropbox_Refresh", Refresh);
+    EndIf;
+    
+EndProcedure
+
+Procedure Dropbox_UpdateToken(FunctionParameters)
+
+    AppKey   = FunctionParameters["Dropbox_Appkey"];
+    AppSecret = FunctionParameters["Dropbox_Appsecret"];
+    RefreshToken      = FunctionParameters["Dropbox_Refresh"];
+    
+    Result = OPI_Dropbox.RefreshToken(AppKey, AppSecret, RefreshToken);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "RefreshToken");
+    
+    Token = Result["access_token"];
+    
+    OPI_GetTestData.ExpectsThat(Token).Filled();
+
+    OPI_GetTestData.WriteParameter("Dropbox_Token", Token);
+        
+EndProcedure
+
+Procedure Dropbox_GetObjectInformation(FunctionParameters)
+   
+    Path      = "/New/pic.png";  
+    Token     = FunctionParameters["Dropbox_Token"];
+     
+    Result = OPI_Dropbox.GetObjectInformation(Token, Path, True);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetObjectInformation", "Dropbox");
+
+    Check_DropboxFile(Result, Path);
+    
+    OPI_Tools.Pause(5); 
+    
+EndProcedure
+
+Procedure Dropbox_GetPreview(FunctionParameters)
+   
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New/mydoc.docx"; 
+    
+    Result = OPI_Dropbox.GetPreview(Token, Path);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetPreview", "Dropbox");
+        
+    Check_BinaryData(Result, 190834);
+        
+    OPI_Tools.Pause(5); 
+     
+EndProcedure
+
+Procedure Dropbox_UploadFile(FunctionParameters)
+
+    Path      = "/New/pic.png";  
+    Token     = FunctionParameters["Dropbox_Token"];
+    Image  = FunctionParameters["Picture"];
+    
+    ImagePath = GetTempFileName("png");
+    CopyFile(Image, ImagePath);
+    
+    Result = OPI_Dropbox.UploadFile(Token, ImagePath, Path, True);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "UploadFile", "Dropbox");
+        
+    Check_DropboxFile(Result, Path);
+    DeleteFiles(ImagePath);
+    
+    OPI_Tools.Pause(5); 
+     
+EndProcedure
+
+Procedure Dropbox_UploadFileByURL(FunctionParameters)
+   
+    Path  = "/New/url_doc.docx";  
+    Token = FunctionParameters["Dropbox_Token"];
+    URL   = FunctionParameters["Document"];
+    
+    Result = OPI_Dropbox.UploadFileByURL(Token, URL, Path);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "UploadFileByURL", "Dropbox");
+        
+    Check_DropboxWork(Result);
+   
+    Work = Result["async_job_id"];
+   
+    FunctionParameters.Insert("Dropbox_Job", Work);
+    OPI_GetTestData.WriteParameter("Dropbox_Job", Work);
+    
+    OPI_Tools.Pause(5); 
+     
+EndProcedure
+
+Procedure Dropbox_GetUploadStatusByURL(FunctionParameters)
+
+    Token    = FunctionParameters["Dropbox_Token"];
+    WorkID = FunctionParameters["Dropbox_Job"];
+    Status   = "in_progress";    
+    
+    WHile Status = "in_progress" Do 
+        
+        Result = OPI_Dropbox.GetUploadStatusByURL(Token, WorkID);
+        Status    = Result[".tag"];
+        
+        OPI_Tools.Pause(5);
+        
+        // !OInt OPI_GetTestData.WriteLog(Result, "GetUploadStatusByURL", "Dropbox");
+        
+    EndDo;
+    
+    // END
+    
+    Check_DropboxStatus(Result);
+    
+    Path      = "/New/url_doc.docx";
+    Result = OPI_Dropbox.DeleteObject(Token, Path);
+    
+    Check_DropboxMetadata(Result, Path);
+    OPI_Tools.Pause(5); 
+        
+EndProcedure
+
+Procedure Dropbox_DeleteObject(FunctionParameters)
+ 
+    Path      = "/New/pic.png";  
+    Token     = FunctionParameters["Dropbox_Token"];  
+    
+    Result = OPI_Dropbox.DeleteObject(Token, Path);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteObject", "Dropbox");
+
+    Check_DropboxMetadata(Result, Path);
+    
+    OPI_Tools.Pause(5); 
+     
+EndProcedure
+
+Procedure Dropbox_CopyObject(FunctionParameters)
+    
+    Original  = "/New/pic.png";
+    Copy     = "/New/pic_copy.png";  
+    Token     = FunctionParameters["Dropbox_Token"];
+    
+    Result = OPI_Dropbox.CopyObject(Token, Original, Copy);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CopyObject", "Dropbox");
+        
+    Check_DropboxMetadata(Result, Copy);
+    
+    Result = OPI_Dropbox.DeleteObject(Token, Copy);
+    Check_DropboxMetadata(Result, Copy);
+        
+    OPI_Tools.Pause(5); 
+    
+EndProcedure
+
+Procedure Dropbox_MoveObject(FunctionParameters)
+    
+    OriginalPath  = "/New/pic.png";
+    TargetPath      = "/pic.png";  
+    Token            = FunctionParameters["Dropbox_Token"];
+    
+    Result = OPI_Dropbox.MoveObject(Token, OriginalPath, TargetPath);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "Dropbox_MoveObject", "Dropbox");
+        
+    Check_DropboxMetadata(Result, TargetPath);
+    
+    Result = OPI_Dropbox.MoveObject(Token, TargetPath, OriginalPath);
+    Check_DropboxMetadata(Result, OriginalPath);
+        
+    OPI_Tools.Pause(5); 
+    
+EndProcedure
+
+Procedure Dropbox_CreateFolder(FunctionParameters)
+    
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New toаталог";
+    
+    Result = OPI_Dropbox.CreateFolder(Token, Path);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CreateFolder", "Dropbox");
+        
+    Check_DropboxMetadata(Result, Path);
+    
+    Result = OPI_Dropbox.DeleteObject(Token, Path);
+    Check_DropboxMetadata(Result, Path);
+        
+    OPI_Tools.Pause(5); 
+    
+EndProcedure
+
+Procedure Dropbox_DownloadFile(FunctionParameters)
+
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New/pic.png"; 
+    
+    Result = OPI_Dropbox.DownloadFile(Token, Path);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DownloadFile", "Dropbox");
+        
+    Check_BinaryData(Result, 2114023);
+        
+    OPI_Tools.Pause(5); 
+        
+EndProcedure
+
+Procedure Dropbox_DownloadFolder(FunctionParameters)
+    
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New";
+    
+    Result = OPI_Dropbox.DownloadFolder(Token, Path);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DownloadFolder", "Dropbox");
+        
+    Check_BinaryData(Result);
+        
+    OPI_Tools.Pause(5); 
+    
+EndProcedure
+
+Procedure Dropbox_GetFolderFileList(FunctionParameters)
+ 
+    Path      = "/New";  
+    Token     = FunctionParameters["Dropbox_Token"];
+     
+    Result = OPI_Dropbox.GetListOfFolderFiles(Token, Path, True);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetListOfFolderFiles", "Dropbox");
+
+    Check_DropboxArray(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure 
+
+Procedure Dropbox_GetObjectVersionList(FunctionParameters)
+
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New/pic.png"; 
+    
+    Result = OPI_Dropbox.GetObjectVersionList(Token, Path, 1);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetObjectVersionList", "Dropbox");
+        
+   Check_DropboxArray(Result, 1);
+   
+   Revision = Result["entries"][0]["rev"];
+   
+   FunctionParameters.Insert("Dropbox_FileRevision", Revision);
+   OPI_GetTestData.WriteParameter("Dropbox_FileRevision", Revision);
+        
+   OPI_Tools.Pause(5); 
+        
+EndProcedure
+
+Procedure Dropbox_RestoreObjectToVersion(FunctionParameters)
+   
+    Version    = FunctionParameters["Dropbox_FileRevision"];
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New/pic.png";  
+    
+    Result = OPI_Dropbox.RestoreObjectToVersion(Token, Path, Version);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "RestoreObjectToVersion", "Dropbox");
+    
+    Check_DropboxFile(Result, Path);
+    
+    OPI_Tools.Pause(5);  
+    
+EndProcedure
+
+Procedure Dropbox_GetTagList(FunctionParameters)
+
+    Token = FunctionParameters["Dropbox_Token"];
+    
+    PathsArray = New Array;
+    PathsArray.Add("/New/Dogs.mp3");
+    PathsArray.Add("/New/mydoc.docx");  
+    
+    Result = OPI_Dropbox.GetTagList(Token, PathsArray);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetTagList", "Dropbox");
+    
+    Check_DropboxTags(Result, PathsArray.Quantity());
+    
+    Result = OPI_Dropbox.GetTagList(Token, "/New/mydoc.docx");
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetTagList (оdиночный)");
+    
+    Check_DropboxTags(Result, 1);
+    
+    HasTag = False;
+    
+    For Each Tag In Result["paths_to_tags"][0]["tags"] Do
+        If Tag["tag_text"] = "important" Then
+            HasTag = True;    
+        EndIf;
+    EndDo;
+    
+    OPI_GetTestData.ExpectsThat(HasTag).Equal(True);
+    
+    OPI_Tools.Pause(5);  
+        
+EndProcedure
+
+Procedure Dropbox_AddTag(FunctionParameters)
+    
+    Tag       = "Important";
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New/mydoc.docx";  
+    
+    Result = OPI_Dropbox.AddTag(Token, Path, Tag);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddTag", "Dropbox");
+    
+    Check_Empty(Result);
+    
+    OPI_Tools.Pause(5);  
+    
+EndProcedure
+
+Procedure Dropbox_DeleteTag(FunctionParameters)
+    
+    Tag       = "Important";
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New/mydoc.docx";  
+    
+    Result = OPI_Dropbox.DeleteTag(Token, Path, Tag);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "DeleteTag", "Dropbox");
+    
+    Check_Empty(Result);
+    
+    OPI_Tools.Pause(5);  
+    
+EndProcedure
+
+Procedure Dropbox_GetAccountInformation(FunctionParameters)
+    
+    Token = FunctionParameters["Dropbox_Token"];
+    
+    Result = OPI_Dropbox.GetAccountInformation(Token);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetAccountInformation", "Dropbox");
+    
+    Check_DropboxAccount(Result);
+    
+    Result = OPI_Dropbox.GetAccountInformation(Token, Result["account_id"]);
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetAccountInformation (withторонний)");
+    
+    Check_DropboxAccount(Result);
+    
+    OPI_Tools.Pause(5);
+    
+EndProcedure
+
+Procedure Dropbox_GetSpaceUsageData(FunctionParameters)
+  
+    Token = FunctionParameters["Dropbox_Token"];
+    
+    Result = OPI_Dropbox.GetSpaceUsageData(Token);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "GetSpaceUsageData", "Dropbox");
+    
+    Check_DropboxSpace(Result);
+      
+EndProcedure
+
+Procedure Dropbox_AddUsersToFile(FunctionParameters)
+    
+    Token = FunctionParameters["Dropbox_Token"];
+    Email = FunctionParameters["Dropbox_OtherUser"];
+    File  = FunctionParameters["Dropbox_FileID"];
+    
+    Result = OPI_Dropbox.AddUsersToFile(Token, File, Email, False);
+    
+    // END
+        
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddUserToFile", "Dropbox");
+    
+    Check_DropboxMember(Result, Email, False);
+    
+    Mails = New Array;
+    Mails.Add(Email);
+    
+    Result = OPI_Dropbox.AddUsersToFile(Token, File, Mails, True);
+    
+    Check_DropboxMember(Result, Email, True);
+    
+EndProcedure
+
+Procedure Dropbox_PublishFolder(FunctionParameters)
+    
+    Token     = FunctionParameters["Dropbox_Token"];
+    Path      = "/New"; 
+   
+    Result = OPI_Dropbox.PublishFolder(Token, Path);
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "PublishFolder", "Dropbox");
+        
+    Check_DropboxPublicFolder(Result);
+   
+    FolderID = Result["shared_folder_id"];
+   
+    FunctionParameters.Insert("Dropbox_SharedFolder", FolderID);
+    OPI_GetTestData.WriteParameter("Dropbox_SharedFolder", FolderID);
+        
+    OPI_Tools.Pause(5); 
+
+EndProcedure
+
+Procedure Dropbox_CancelFolderPublication(FunctionParameters)
+    
+    Token  = FunctionParameters["Dropbox_Token"];
+    Folder  = FunctionParameters["Dropbox_SharedFolder"];
+ 
+    Result     = OPI_Dropbox.CancelFolderPublication(Token, Folder);
+    CurrentStatus = "in_progress";
+    JobID      = Result["async_job_id"];
+    
+    WHile CurrentStatus = "in_progress" Do
+        Result     = OPI_Dropbox.GetAsynchronousChangeStatus(Token, JobID);
+        CurrentStatus = Result[".tag"];
+        OPI_Tools.Pause(3);
+    EndDo;
+    
+    // END
+    
+    // !OInt OPI_GetTestData.WriteLog(Result, "CancelFolderPublication", "Dropbox");
+    
+   Check_DropboxStatus(Result);
+   
+   OPI_Tools.Pause(5); 
+   
+EndProcedure
+
+Procedure Dropbox_AddUsersToFolder(FunctionParameters)
+    
+    Token  = FunctionParameters["Dropbox_Token"];
+    Email  = FunctionParameters["Dropbox_OtherUser"];
+    Folder  = FunctionParameters["Dropbox_SharedFolder"]; // shared_folder_id
+    
+    Result = OPI_Dropbox.AddUsersToFolder(Token, Folder, Email, False);
+    
+    // END
+        
+    // !OInt OPI_GetTestData.WriteLog(Result, "AddUserToFile", "Dropbox");
+    
+    Check_Empty(Result);
+    
+    Mails = New Array;
+    Mails.Add(Email);
+    
+    Result = OPI_Dropbox.AddUsersToFolder(Token, Folder, Mails, True);
+    
+    Check_Empty(Result);
+    
+EndProcedure
+
+Procedure Dropbox_CancelFilePublication(FunctionParameters)
+	
+	Token = FunctionParameters["Dropbox_Token"];
+    File  = FunctionParameters["Dropbox_FileID"];
+    
+    Result = OPI_Dropbox.CancelFilePublication(Token, File);
+    
+    // END
+        
+    // !OInt OPI_GetTestData.WriteLog(Result, "CancelFilePublication", "Dropbox");
+    
+    Check_Empty(Result);
+    
+EndProcedure
+
+#EndRegion
+
+#EndRegion
+
+#EndRegion
diff --git a/service/interim/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo b/service/interim/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
new file mode 100644
index 0000000000..e8ea7bc39e
--- /dev/null
+++ b/service/interim/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_Tests</name>
+  <synonym>
+    <key></key>
+    <value>OPI теwithты</value>
+  </synonym>
+  <synonym>
+    <key>ru</key>
+    <value>Tests for YaxUnit (OPI)</value>
+  </synonym>
+  <server>true</server>
+  <externalConnection>true</externalConnection>
+  <clientOrdinaryApplication>true</clientOrdinaryApplication>
+</mdclass:CommonModule>
diff --git a/service/interim/en/OPI/src/Configuration/Configuration.mdo b/service/interim/en/OPI/src/Configuration/Configuration.mdo
new file mode 100644
index 0000000000..988bd2ceda
--- /dev/null
+++ b/service/interim/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>Отtoрытый паtoет интеграций</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>Отtoрытый паtoет интеграций - toбор библиотеto for интеграции with неtoоторыми популярными API for 1C:Enterprise. Он withоwithтоит from общих моdулей, toажdый from toоторых отinечает за withinой API, а таtoже неwithtoольtoих моdулей-инwithтрументоin, общих for all.</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>Руwithwithtoий</name>
+    <objectBelonging>Adopted</objectBelonging>
+    <extension xsi:type="mdclassExtension:LanguageExtension">
+      <languageCode>Checked</languageCode>
+    </extension>
+    <languageCode>ru</languageCode>
+  </languages>
+  <subsystems>Subsystem.OPI_Andнтеграция</subsystems>
+  <commonModules>CommonModule.OPI_Tools</commonModules>
+  <commonModules>CommonModule.OPI_Cryptography</commonModules>
+  <commonModules>CommonModule.OPI_TypeConversion</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_Tests</commonModules>
+  <commonModules>CommonModule.OPI_GetTestData</commonModules>
+</mdclass:Configuration>
diff --git a/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi b/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
new file mode 100644
index 0000000000..8c570a6481
--- /dev/null
+++ b/service/interim/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/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo b/service/interim/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
new file mode 100644
index 0000000000..06461b4314
--- /dev/null
+++ b/service/interim/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_Andнтеграция</name>
+  <synonym>
+    <key>ru</key>
+    <value>Andнтеграция</value>
+  </synonym>
+  <includeHelpInContents>true</includeHelpInContents>
+  <includeInCommandInterface>true</includeInCommandInterface>
+  <content>CommonModule.OPI_Tools</content>
+  <content>CommonModule.OPI_Cryptography</content>
+  <content>CommonModule.OPI_TypeConversion</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_Tests</content>
+  <content>CommonModule.OPI_GetTestData</content>
+</mdclass:Subsystem>
diff --git a/en/OPI/.project b/src/en/OPI/.project
similarity index 100%
rename from en/OPI/.project
rename to src/en/OPI/.project
diff --git a/en/OPI/.settings/org.eclipse.core.resources.prefs b/src/en/OPI/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from en/OPI/.settings/org.eclipse.core.resources.prefs
rename to src/en/OPI/.settings/org.eclipse.core.resources.prefs
diff --git a/en/OPI/DT-INF/PROJECT.PMF b/src/en/OPI/DT-INF/PROJECT.PMF
similarity index 100%
rename from en/OPI/DT-INF/PROJECT.PMF
rename to src/en/OPI/DT-INF/PROJECT.PMF
diff --git a/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo b/src/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
rename to src/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Cryptography/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Cryptography/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Cryptography/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Cryptography/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Cryptography/OPI_Cryptography.mdo b/src/en/OPI/src/CommonModules/OPI_Cryptography/OPI_Cryptography.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Cryptography/OPI_Cryptography.mdo
rename to src/en/OPI/src/CommonModules/OPI_Cryptography/OPI_Cryptography.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo b/src/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
rename to src/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
diff --git a/en/OPI/src/CommonModules/OPI_GetTestData/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GetTestData/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GetTestData/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_GetTestData/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_GetTestData/OPI_GetTestData.mdo b/src/en/OPI/src/CommonModules/OPI_GetTestData/OPI_GetTestData.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GetTestData/OPI_GetTestData.mdo
rename to src/en/OPI/src/CommonModules/OPI_GetTestData/OPI_GetTestData.mdo
diff --git a/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo b/src/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
rename to src/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
diff --git a/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo b/src/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
rename to src/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
diff --git a/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo b/src/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
rename to src/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
diff --git a/src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl b/src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
new file mode 100644
index 0000000000..7161529741
--- /dev/null
+++ b/src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
@@ -0,0 +1,173 @@
+// Location OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os
+// Library: Google Workspace
+// CLI command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+// Generate code retrieval link
+// Returns URL for browser authorization
+// 
+// Parameters:
+//  ClientID - String - Client ID                      - id
+//  Calendar - Boolean - Calendar methods permission  - calendar
+//  Drive    - Boolean - Drive methods permission     - drive
+//  Sheets   - Boolean - Sheets methods permission    - sheets
+// 
+// Return value:
+//  String - Code retrieval link
+Function FormCodeRetrievalLink(Val ClientID
+    , Val Calendar = True
+    , Val Drive = True
+    , Val Sheets = True) Export
+    
+    OPI_TypeConversion.GetLine(ClientID);
+    OPI_TypeConversion.GetBoolean(Calendar);
+    OPI_TypeConversion.GetBoolean(Sheets);
+    OPI_TypeConversion.GetBoolean(Drive);
+    
+    URL = "https://accounts.google.com/o/oauth2/auth";
+    
+    URLParameters = New Structure;
+    URLParameters.Insert("response_type", "code");
+    URLParameters.Insert("client_id"    , ClientID);
+    URLParameters.Insert("redirect_uri" , "http://localhost");
+    URLParameters.Insert("access_type"  , "offline");
+    URLParameters.Insert("scope"        , GetPermissionsList(Calendar, Drive, Sheets));
+    
+    URL = URL + OPI_Tools.RequestParametersToString(URLParameters);
+    
+    Return URL;
+    
+EndFunction
+
+// Get token by code
+// Gets token by code from browser authorization
+// 
+// Parameters:
+//  ClientID     - String - Client ID        - id
+//  ClientSecret - String - Client secret    - secret
+//  Code         - String - Code from browser - code
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function GetTokenByCode(Val ClientID, Val ClientSecret, Val Code) Export
+    
+    OPI_TypeConversion.GetLine(ClientID);
+    OPI_TypeConversion.GetLine(ClientSecret);
+    OPI_TypeConversion.GetLine(Code);
+    
+    URL = "https://accounts.google.com/o/oauth2/token";
+           
+    URLParameters = New Structure;
+    URLParameters.Insert("grant_type"   , "authorization_code");
+    URLParameters.Insert("client_id"    , ClientID);
+    URLParameters.Insert("client_secret", ClientSecret);
+    URLParameters.Insert("redirect_uri" , "http://localhost");  
+    URLParameters.Insert("code"         , Code);
+    
+    Response = OPI_Tools.Post(URL, URLParameters, , False);
+    
+    Return Response;
+
+EndFunction
+
+// Refresh token
+// Updates token by Refresh token
+// 
+// Parameters:
+//  ClientID     - String - Client ID     - id
+//  ClientSecret - String - Client secret - secret
+//  RefreshToken - String - Refresh token - refresh
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Google
+Function RefreshToken(Val ClientID, Val ClientSecret, Val RefreshToken) Export
+    
+    OPI_TypeConversion.GetLine(ClientID);
+    OPI_TypeConversion.GetLine(ClientSecret);
+    OPI_TypeConversion.GetLine(RefreshToken);
+    
+    URL = "https://accounts.google.com/o/oauth2/token";
+           
+    URLParameters = New Structure;
+    URLParameters.Insert("grant_type"   , "refresh_token");
+    URLParameters.Insert("client_id"    , ClientID);
+    URLParameters.Insert("client_secret", ClientSecret);  
+    URLParameters.Insert("refresh_token", RefreshToken);
+    
+    Response = OPI_Tools.Post(URL, URLParameters, , False);
+    
+    Return Response;
+
+EndFunction
+
+#EndRegion
+
+#Region ServiceProgramInterface
+
+Function GetAuthorizationHeader(Val Token) Export
+    
+    OPI_TypeConversion.GetLine(Token);
+    
+    Headers = New Match;
+    Headers.Insert("Authorization", "Bearer " + Token);
+    
+    Return Headers;
+    
+EndFunction
+
+#EndRegion
+
+#Region ServiceProceduresAndFunctions
+
+Function GetPermissionsList(Calendar, Drive, Sheets)
+    
+    Permissions array = New Array;
+    
+    If Calendar Then
+        Permissions array.Add("https://www.googleapis.com/auth/calendar");
+    EndIf;
+    
+    If Drive Then
+        Permissions array.Add("https://www.googleapis.com/auth/drive");
+    EndIf;
+    
+    If Sheets Then
+        Permissions array.Add("https://www.googleapis.com/auth/spreadsheets");
+    EndIf;
+        
+    Return StrJoin(Permissions array, " ");
+    
+EndFunction
+
+#EndRegion
diff --git a/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo b/src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
rename to src/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Notion/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Notion/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Notion/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Notion/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo b/src/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
rename to src/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Slack/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Slack/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Slack/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Slack/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo b/src/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
rename to src/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo b/src/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
rename to src/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Tools/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Tools/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Tools/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Tools/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Tools/OPI_Tools.mdo b/src/en/OPI/src/CommonModules/OPI_Tools/OPI_Tools.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Tools/OPI_Tools.mdo
rename to src/en/OPI/src/CommonModules/OPI_Tools/OPI_Tools.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo b/src/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
rename to src/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
diff --git a/en/OPI/src/CommonModules/OPI_TypeConversion/Module.bsl b/src/en/OPI/src/CommonModules/OPI_TypeConversion/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_TypeConversion/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_TypeConversion/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_TypeConversion/OPI_TypeConversion.mdo b/src/en/OPI/src/CommonModules/OPI_TypeConversion/OPI_TypeConversion.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_TypeConversion/OPI_TypeConversion.mdo
rename to src/en/OPI/src/CommonModules/OPI_TypeConversion/OPI_TypeConversion.mdo
diff --git a/en/OPI/src/CommonModules/OPI_VK/Module.bsl b/src/en/OPI/src/CommonModules/OPI_VK/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_VK/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_VK/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo b/src/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
rename to src/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Viber/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Viber/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Viber/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Viber/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo b/src/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
rename to src/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
diff --git a/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl b/src/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo b/src/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
rename to src/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
diff --git a/src/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl b/src/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
new file mode 100644
index 0000000000..a62bc29112
--- /dev/null
+++ b/src/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
@@ -0,0 +1,112 @@
+// Location OS: ./OInt/core/Modules/OPI_YandexID.os
+// Library: Yandex ID
+// CLI Command: 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
+
+// Uncomment if OneScript is executed
+// #Use "../../tools"
+
+#Region ProgrammingInterface
+
+// Get confirmation code
+// Gets the confirmation code and the address of the page where it needs to be entered
+// 
+// Parameters:
+//  ClientId - String - Client id - id
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function GetConfirmationCode(Val ClientId) Export
+
+    OPI_TypeConversion.GetLine(ClientId);
+    
+    Parameters = New Structure("client_id", ClientId);
+    Response     = OPI_Tools.Post("https://oauth.yandex.ru/device/code", Parameters, , False);
+    
+    Return Response;
+    
+EndFunction
+
+// Convert code to token
+// Converts the code to a token after entering the code when executing GetConfirmationCode
+// 
+// Parameters:
+//  ClientId      - String - Client id                                 - id
+//  ClientSecret  - String - Client secret                             - secret
+//  DeviceCode - String - device_code from GetConfirmationCode() - device
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function ConvertCodeToToken(Val ClientId, Val ClientSecret, Val DeviceCode) Export
+    
+    OPI_TypeConversion.GetLine(ClientId);
+    OPI_TypeConversion.GetLine(ClientSecret);
+    OPI_TypeConversion.GetLine(DeviceCode);
+    
+    Parameters = New Structure;
+    Parameters.Insert("grant_type"    , "device_code");
+    Parameters.Insert("code"          , DeviceCode);
+    Parameters.Insert("client_id"     , ClientId);
+    Parameters.Insert("client_secret" , ClientSecret);
+    
+    Response = OPI_Tools.Post("https://oauth.yandex.ru/token", Parameters, , False);
+    
+    Return Response;
+    
+EndFunction
+
+// Refresh token
+// Updates token by Refresh token
+// 
+// Parameters:
+//  ClientId     - String - Client id      - id
+//  ClientSecret - String - Client secret  - secret
+//  RefreshToken - String - Refresh token  - refresh
+// 
+// Return value:
+//  Key-Value Pair - serialized JSON response from Yandex
+Function RefreshToken(Val ClientId, Val ClientSecret, Val RefreshToken) Export
+    
+    OPI_TypeConversion.GetLine(ClientId);
+    OPI_TypeConversion.GetLine(ClientSecret);
+    OPI_TypeConversion.GetLine(RefreshToken);
+    
+    Parameters = New Structure;
+    Parameters.Insert("grant_type"    , "refresh_token");
+    Parameters.Insert("refresh_token" , RefreshToken);
+    Parameters.Insert("client_id"     , ClientId);
+    Parameters.Insert("client_secret" , ClientSecret);
+    
+    Response = OPI_Tools.Post("https://oauth.yandex.ru/token", Parameters, , False);
+    
+    Return Response;
+    
+EndFunction
+
+#EndRegion
diff --git a/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo b/src/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
rename to src/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
diff --git a/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
rename to src/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
diff --git a/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo b/src/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
similarity index 100%
rename from en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
rename to src/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
diff --git a/en/OPI/src/Configuration/Configuration.mdo b/src/en/OPI/src/Configuration/Configuration.mdo
similarity index 100%
rename from en/OPI/src/Configuration/Configuration.mdo
rename to src/en/OPI/src/Configuration/Configuration.mdo
diff --git a/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi b/src/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
similarity index 100%
rename from en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
rename to src/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
diff --git a/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo b/src/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
similarity index 100%
rename from en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
rename to src/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
diff --git a/ru/OInt/core/Modules/OPI_Airtable.os b/src/ru/OInt/core/Modules/OPI_Airtable.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_Airtable.os
rename to src/ru/OInt/core/Modules/OPI_Airtable.os
index 5562675c6e..30abde603a 100644
--- a/ru/OInt/core/Modules/OPI_Airtable.os
+++ b/src/ru/OInt/core/Modules/OPI_Airtable.os
@@ -1,681 +1,681 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Airtable.os
-// Библиотека: Airtable
-// Команда CLI: airtable
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСБазами
-
-// Получить список баз
-// Получает список доступных баз
-// 
-// Параметры:
-//  Токен  - Строка - Токен                                                              - token
-//  Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offset
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable 
-Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ);
-    
-    URL        = "https://api.airtable.com/v0/meta/bases";
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-    Параметры  = Новый Структура;
-    
-    OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить таблицы базы
-// Получает схему таблиц базы
-// 
-// Параметры:
-//  Токен - Строка - Токен              - token
-//  База  - Строка - Идентификатор базы - base
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    
-    URL        = "https://api.airtable.com/v0/meta/bases/" + База + "/tables";
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать базу
-// Создает новую базу данных
-// 
-// Параметры:
-//  Токен               - Строка                    - Токен                                                - token
-//  РабочееПространство - Строка                    - Идентификатор рабочего пространства                  - ws
-//  Наименование        - Строка                    - Наименование новой базы                              - title
-//  КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц);
-    
-    Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура")
-        И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда
-        
-        ВызватьИсключение "Ошибка в данных коллекции таблиц";
-        
-    КонецЕсли;
-    
-    URL           = "https://api.airtable.com/v0/meta/bases";
-    Заголовки     = ПолучитьЗаголовокАвторизации(Токен);
-    МассивТаблиц  = Новый Массив;
-    
-    Для Каждого Таблица Из КоллекцияТаблиц Цикл
-        
-        Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение);
-        МассивТаблиц.Добавить(Описание);
-        
-    КонецЦикла;
- 
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("name"       , Наименование       , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("tables"     , МассивТаблиц       , "Массив", Параметры);
-    OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры);
-     
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСТаблицами
-
-// Создать таблицу
-// Создает новую таблицу в базе
-// 
-// Параметры:
-//  Токен        - Строка              - Токен                      - token
-//  База         - Строка              - Идентификатор базы         - base
-//  Наименование - Строка              - Наименование новой таблицы - title
-//  МассивПолей  - Массив Из Структура - Массив описаний полей      - fieldsdata
-//  Описание     - Строка              - Описание таблицы           - description
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    
-    URL        = "https://api.airtable.com/v0/meta/bases/" + База + "/tables";
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-    Параметры  = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание); 
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Изменить таблицу
-// Изменяет наименование и|или описание базы
-// 
-// Параметры:
-//  Токен        - Строка  - Токен                  - token
-//  База         - Строка  - Идентификатор базы     - base
-//  Таблица      - Строка  - Идентификатор таблицы  - table
-//  Наименование - Строка  - Новое наименование     - title
-//  Описание     - Строка  - Новое описание         - description
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    
-    URL        = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица;
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-    Параметры  = Новый Структура; 
-    
-    OPI_Инструменты.ДобавитьПоле("name"       , Наименование, "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("description", Описание    , "Строка", Параметры);
-    
-    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСПолями
-
-// Создать поле
-// Создет новое поле в таблице
-// 
-// Параметры:
-//  Токен         - Строка                     - Токен                  - token
-//  База          - Строка                     - Идентификатор базы     - base
-//  Таблица       - Строка                     - Идентификатор таблицы  - table
-//  СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля   - fielddata
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля);
-    
-    Если Не ТипЗнч(СтруктураПоля) = Тип("Структура")
-        И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда
-        
-        ВызватьИсключение "Ошибка в данных описания поля";
-        
-    КонецЕсли;
-    
-    URL        = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields";
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен); 
-        
-    Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Изменить поле
-// Изменяет имя и|или описание существующего поля таблицы
-// 
-// Параметры:
-//  Токен        - Строка - Токен                   - token
-//  База         - Строка - Идентификатор базы База - base
-//  Таблица      - Строка - Идентификатор таблицы   - table
-//  Поле         - Строка - Идентификатор поля      - field
-//  Наименование - Строка - Новое наименование      - title
-//  Описание     - Строка - Новое описание          - description
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
-    
-    URL = "https://api.airtable.com/v0/meta/bases/" 
-        + База 
-        + "/tables/" 
-        + Таблица 
-        + "/fields/" 
-        + Поле;
-        
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура();
-    OPI_Инструменты.ДобавитьПоле("name"       , Наименование, "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("description", Описание    , "Строка", Параметры);
-        
-    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить поле (строковое)
-// Получает описание поля строкового типа
-// 
-// Параметры:
-//  Наименование - Строка - Наименование нового поля - title
-// 
-// Возвращаемое значение:
-//  Структура -  Описание поля
-Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт
-    Возврат ОписаниеПримитивногоПоля(Наименование, "richText");
-КонецФункции
-
-// Получить поле (числовое)
-// Получает описание поля числового типа
-// 
-// Параметры:
-//  Наименование - Строка       - Наименование нового поля   - title
-//  Точность     - Число,Строка - Число знаков после запятой - precision
-// 
-// Возвращаемое значение:
-//  Структура -  Описание поля
-Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность);
-    
-    СтруктураОпций = Новый Структура("precision", Точность);
-    Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций);
-    
-КонецФункции
-
-// Получить поле (файл)
-// Получает описание поля файлового типа
-// 
-// Параметры:
-//  Наименование - Строка - Наименование поля - title
-// 
-// Возвращаемое значение:
-//  Структура -  Описание поля
-Функция ПолучитьПолеВложения(Знач Наименование) Экспорт
-    Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments");
-КонецФункции
-
-// Получить поле (флажок)
-// Получает описание поля типа булево
-// 
-// Параметры:
-//  Наименование - Строка - Наименование поля - title
-// 
-// Возвращаемое значение:
-//  Структура -  Описание поля
-Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт
-    
-    СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright");
-    Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций);
-    
-КонецФункции
-
-// Получить поле (дата)
-// Получает описание поля типа дата
-// 
-// Параметры:
-//  Наименование - Строка - Наименование поля - title
-// 
-// Возвращаемое значение:
-//  Структура -  Описание поля
-Функция ПолучитьПолеДаты(Знач Наименование) Экспорт
-    
-    СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso");
-    СтруктураОпций   = Новый Структура("dateFormat", СтруктураФормата);
-    
-    Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций);
-    
-КонецФункции
-
-// Получить поле (email)
-// Получает описание поля с электронной почтой
-// 
-// Параметры:
-//  Наименование - Строка - Наименование поля - title
-// 
-// Возвращаемое значение:
-//  Структура -  Описание поля
-Функция ПолучитьПолеПочты(Знач Наименование) Экспорт
-    Возврат ОписаниеПримитивногоПоля(Наименование, "email");
-КонецФункции
-
-// Получить поле (телефон)
-// Получает описание поля с номером телефона
-// 
-// Параметры:
-//  Наименование - Строка - Наименование поля - title
-// 
-// Возвращаемое значение:
-//  Структура -  Описание поля
-Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт
-    Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber");
-КонецФункции
-
-// Получить поле (url)
-// Получает описание поля с URL
-// 
-// Параметры:
-//  Наименование - Строка - Наименование поля - title
-// 
-// Возвращаемое значение:
-//  Структура -  Описание поля
-Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт
-    Возврат ОписаниеПримитивногоПоля(Наименование, "url");
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСЗаписями
-
-// Получить список записей
-// Получает список записей выбранной таблицы
-// 
-// Параметры:
-//  Токен   - Строка - Токен                                                         - token
-//  База    - Строка - Идентификатор базы данных                                     - base
-//  Таблица - Строка - Идентификатор таблицы                                         - table
-//  Отступ  - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    
-    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица;
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-     
-    Параметры  = Новый Структура();
-    OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
-        
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить запись
-// Получает данные строки таблицы по идентификатору
-// 
-// Параметры:
-//  Токен   - Строка - Токен                          - token
-//  База    - Строка - Идентификатор базы данных      - base
-//  Таблица - Строка - Идентификатор таблицы          - table
-//  Запись  - Строка - Идентификатор записи в таблице - record
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт
-   
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
-    
-    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись;
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-
-    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-    
-    Возврат Ответ;
-     
-КонецФункции
-
-// Создать записи
-// Создает одну или массив записей по описанию или массиву описаний значений полей
-// 
-// Параметры:
-//  Токен   - Строка                         - Токен                                                            - token
-//  База    - Строка                         - Идентификатор базы данных                                        - base
-//  Таблица - Строка                         - Идентификатор таблицы                                            - table
-//  Данные  - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
-    
-    Параметры = Новый Структура();
-    ДобавитьОписаниеДанных(Данные, Параметры);    
-
-    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица;
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;    
-    
-КонецФункции
-
-// Удалить записи
-// Удаляет одну или массив записей по идентификаторам
-// 
-// Параметры:
-//  Токен   - Строка                   - Токен                                             - token
-//  База    - Строка                   - Идентификатор базы данных                         - base
-//  Таблица - Строка                   - Идентификатор таблицы                             - table
-//  Записи  - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьМассив(Записи);
-    
-    СтрокаЗаписей = "";
-    
-    Для Каждого Запись Из Записи Цикл
-        СтрокаЗаписей = СтрокаЗаписей
-            + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?")
-            + "records[]="
-            + OPI_Инструменты.ЧислоВСтроку(Запись);    
-    КонецЦикла;
-    
-    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей;
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-
-    Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-    
-    Возврат Ответ;    
-       
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСКомментариями
-
-// Получить комментарии
-// Получает список комментариев к записи в таблице
-// 
-// Параметры:
-//  Токен   - Строка - Токен                                                         - token
-//  База    - Строка - Идентификатор базы данных                                     - base
-//  Таблица - Строка - Идентификатор таблицы                                         - table
-//  Запись  - Строка - Идентификатор записи в таблице                                - record
-//  Отступ  - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
-    
-    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments";
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-     
-    Параметры  = Новый Структура();
-    OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
-        
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать комментарий
-// Создает комментарий к записи в таблице
-// 
-// Параметры:
-//  Токен   - Строка - Токен                           - token
-//  База    - Строка - Идентификатор базы данных       - base
-//  Таблица - Строка - Идентификатор таблицы           - table
-//  Запись  - Строка - Идентификатор записи в таблице  - record
-//  Текст   - Строка - Текст комментария               - text
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
-    
-    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments";
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-     
-    Параметры  = Новый Структура();
-    OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры);
-        
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Изменить комментарий
-// Изменяет текст существующего комментария
-// 
-// Параметры:
-//  Токен       - Строка - Токен                           - token
-//  База        - Строка - Идентификатор базы данных       - base
-//  Таблица     - Строка - Идентификатор таблицы           - table
-//  Запись      - Строка - Идентификатор записи в таблице  - record
-//  Комментарий - Строка - Идентификатор комментария       - comment
-//  Текст       - Строка - Новый текст комментария         - text
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
-    
-    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий;
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-     
-    Параметры  = Новый Структура();
-    OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры);
-        
-    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить комментарий
-// Удаляет комментарий к записи таблицы
-// 
-// Параметры:
-//  Токен       - Строка - Токен                           - token
-//  База        - Строка - Идентификатор базы данных       - base
-//  Таблица     - Строка - Идентификатор таблицы           - table
-//  Запись      - Строка - Идентификатор записи в таблице  - record
-//  Комментарий - Строка - Идентификатор комментария       - comment
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable 
-Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
-    
-    URL       = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий;
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-        
-    Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-    
-    Возврат Ответ;
-        
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьЗаголовокАвторизации(Знач Токен)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Заголовки = Новый Соответствие;
-    Заголовки.Вставить("Authorization", "Bearer " + Токен);
-    
-    Возврат Заголовки;
-    
-КонецФункции
-
-Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "")
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей);
-    
-    ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей);
-    
-    OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы);
-    
-    Возврат ОписаниеТаблицы;
-    
-КонецФункции
-
-Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "")
-    
-    СтруктураПоля = Новый Структура();
-    OPI_Инструменты.ДобавитьПоле("name"   , Наименование, "Строка"   , СтруктураПоля);
-    OPI_Инструменты.ДобавитьПоле("type"   , Тип         , "Строка"   , СтруктураПоля);
-    OPI_Инструменты.ДобавитьПоле("options", Опции       , "Коллекция", СтруктураПоля);
-    
-    Возврат СтруктураПоля;
-
-КонецФункции
-
-Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры)
-    
-    Если ТипЗнч(Данные) = Тип("Массив") Тогда
-        
-        МассивОтправки = Новый Массив;
-        
-        Для Каждого ОписаниеЗаписи Из Данные Цикл
-            МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи));    
-        КонецЦикла;
-        
-        OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры);
-        
-    Иначе
-       
-       OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры); 
-       
-    КонецЕсли;
-        
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Airtable.os
+// Библиотека: Airtable
+// Команда CLI: airtable
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСБазами
+
+// Получить список баз
+// Получает список доступных баз
+// 
+// Параметры:
+//  Токен  - Строка - Токен                                                              - token
+//  Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offset
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable 
+Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ);
+    
+    URL        = "https://api.airtable.com/v0/meta/bases";
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+    Параметры  = Новый Структура;
+    
+    OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить таблицы базы
+// Получает схему таблиц базы
+// 
+// Параметры:
+//  Токен - Строка - Токен              - token
+//  База  - Строка - Идентификатор базы - base
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    
+    URL        = "https://api.airtable.com/v0/meta/bases/" + База + "/tables";
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать базу
+// Создает новую базу данных
+// 
+// Параметры:
+//  Токен               - Строка                    - Токен                                                - token
+//  РабочееПространство - Строка                    - Идентификатор рабочего пространства                  - ws
+//  Наименование        - Строка                    - Наименование новой базы                              - title
+//  КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц);
+    
+    Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура")
+        И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда
+        
+        ВызватьИсключение "Ошибка в данных коллекции таблиц";
+        
+    КонецЕсли;
+    
+    URL           = "https://api.airtable.com/v0/meta/bases";
+    Заголовки     = ПолучитьЗаголовокАвторизации(Токен);
+    МассивТаблиц  = Новый Массив;
+    
+    Для Каждого Таблица Из КоллекцияТаблиц Цикл
+        
+        Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение);
+        МассивТаблиц.Добавить(Описание);
+        
+    КонецЦикла;
+ 
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("name"       , Наименование       , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("tables"     , МассивТаблиц       , "Массив", Параметры);
+    OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры);
+     
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСТаблицами
+
+// Создать таблицу
+// Создает новую таблицу в базе
+// 
+// Параметры:
+//  Токен        - Строка              - Токен                      - token
+//  База         - Строка              - Идентификатор базы         - base
+//  Наименование - Строка              - Наименование новой таблицы - title
+//  МассивПолей  - Массив Из Структура - Массив описаний полей      - fieldsdata
+//  Описание     - Строка              - Описание таблицы           - description
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    
+    URL        = "https://api.airtable.com/v0/meta/bases/" + База + "/tables";
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+    Параметры  = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание); 
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Изменить таблицу
+// Изменяет наименование и|или описание базы
+// 
+// Параметры:
+//  Токен        - Строка  - Токен                  - token
+//  База         - Строка  - Идентификатор базы     - base
+//  Таблица      - Строка  - Идентификатор таблицы  - table
+//  Наименование - Строка  - Новое наименование     - title
+//  Описание     - Строка  - Новое описание         - description
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    
+    URL        = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица;
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+    Параметры  = Новый Структура; 
+    
+    OPI_Инструменты.ДобавитьПоле("name"       , Наименование, "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("description", Описание    , "Строка", Параметры);
+    
+    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСПолями
+
+// Создать поле
+// Создет новое поле в таблице
+// 
+// Параметры:
+//  Токен         - Строка                     - Токен                  - token
+//  База          - Строка                     - Идентификатор базы     - base
+//  Таблица       - Строка                     - Идентификатор таблицы  - table
+//  СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля   - fielddata
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля);
+    
+    Если Не ТипЗнч(СтруктураПоля) = Тип("Структура")
+        И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда
+        
+        ВызватьИсключение "Ошибка в данных описания поля";
+        
+    КонецЕсли;
+    
+    URL        = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields";
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен); 
+        
+    Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Изменить поле
+// Изменяет имя и|или описание существующего поля таблицы
+// 
+// Параметры:
+//  Токен        - Строка - Токен                   - token
+//  База         - Строка - Идентификатор базы База - base
+//  Таблица      - Строка - Идентификатор таблицы   - table
+//  Поле         - Строка - Идентификатор поля      - field
+//  Наименование - Строка - Новое наименование      - title
+//  Описание     - Строка - Новое описание          - description
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
+    
+    URL = "https://api.airtable.com/v0/meta/bases/" 
+        + База 
+        + "/tables/" 
+        + Таблица 
+        + "/fields/" 
+        + Поле;
+        
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура();
+    OPI_Инструменты.ДобавитьПоле("name"       , Наименование, "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("description", Описание    , "Строка", Параметры);
+        
+    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить поле (строковое)
+// Получает описание поля строкового типа
+// 
+// Параметры:
+//  Наименование - Строка - Наименование нового поля - title
+// 
+// Возвращаемое значение:
+//  Структура -  Описание поля
+Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт
+    Возврат ОписаниеПримитивногоПоля(Наименование, "richText");
+КонецФункции
+
+// Получить поле (числовое)
+// Получает описание поля числового типа
+// 
+// Параметры:
+//  Наименование - Строка       - Наименование нового поля   - title
+//  Точность     - Число,Строка - Число знаков после запятой - precision
+// 
+// Возвращаемое значение:
+//  Структура -  Описание поля
+Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность);
+    
+    СтруктураОпций = Новый Структура("precision", Точность);
+    Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций);
+    
+КонецФункции
+
+// Получить поле (файл)
+// Получает описание поля файлового типа
+// 
+// Параметры:
+//  Наименование - Строка - Наименование поля - title
+// 
+// Возвращаемое значение:
+//  Структура -  Описание поля
+Функция ПолучитьПолеВложения(Знач Наименование) Экспорт
+    Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments");
+КонецФункции
+
+// Получить поле (флажок)
+// Получает описание поля типа булево
+// 
+// Параметры:
+//  Наименование - Строка - Наименование поля - title
+// 
+// Возвращаемое значение:
+//  Структура -  Описание поля
+Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт
+    
+    СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright");
+    Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций);
+    
+КонецФункции
+
+// Получить поле (дата)
+// Получает описание поля типа дата
+// 
+// Параметры:
+//  Наименование - Строка - Наименование поля - title
+// 
+// Возвращаемое значение:
+//  Структура -  Описание поля
+Функция ПолучитьПолеДаты(Знач Наименование) Экспорт
+    
+    СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso");
+    СтруктураОпций   = Новый Структура("dateFormat", СтруктураФормата);
+    
+    Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций);
+    
+КонецФункции
+
+// Получить поле (email)
+// Получает описание поля с электронной почтой
+// 
+// Параметры:
+//  Наименование - Строка - Наименование поля - title
+// 
+// Возвращаемое значение:
+//  Структура -  Описание поля
+Функция ПолучитьПолеПочты(Знач Наименование) Экспорт
+    Возврат ОписаниеПримитивногоПоля(Наименование, "email");
+КонецФункции
+
+// Получить поле (телефон)
+// Получает описание поля с номером телефона
+// 
+// Параметры:
+//  Наименование - Строка - Наименование поля - title
+// 
+// Возвращаемое значение:
+//  Структура -  Описание поля
+Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт
+    Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber");
+КонецФункции
+
+// Получить поле (url)
+// Получает описание поля с URL
+// 
+// Параметры:
+//  Наименование - Строка - Наименование поля - title
+// 
+// Возвращаемое значение:
+//  Структура -  Описание поля
+Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт
+    Возврат ОписаниеПримитивногоПоля(Наименование, "url");
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСЗаписями
+
+// Получить список записей
+// Получает список записей выбранной таблицы
+// 
+// Параметры:
+//  Токен   - Строка - Токен                                                         - token
+//  База    - Строка - Идентификатор базы данных                                     - base
+//  Таблица - Строка - Идентификатор таблицы                                         - table
+//  Отступ  - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    
+    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица;
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+     
+    Параметры  = Новый Структура();
+    OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
+        
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить запись
+// Получает данные строки таблицы по идентификатору
+// 
+// Параметры:
+//  Токен   - Строка - Токен                          - token
+//  База    - Строка - Идентификатор базы данных      - base
+//  Таблица - Строка - Идентификатор таблицы          - table
+//  Запись  - Строка - Идентификатор записи в таблице - record
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт
+   
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+    
+    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись;
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+
+    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+    
+    Возврат Ответ;
+     
+КонецФункции
+
+// Создать записи
+// Создает одну или массив записей по описанию или массиву описаний значений полей
+// 
+// Параметры:
+//  Токен   - Строка                         - Токен                                                            - token
+//  База    - Строка                         - Идентификатор базы данных                                        - base
+//  Таблица - Строка                         - Идентификатор таблицы                                            - table
+//  Данные  - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
+    
+    Параметры = Новый Структура();
+    ДобавитьОписаниеДанных(Данные, Параметры);    
+
+    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица;
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;    
+    
+КонецФункции
+
+// Удалить записи
+// Удаляет одну или массив записей по идентификаторам
+// 
+// Параметры:
+//  Токен   - Строка                   - Токен                                             - token
+//  База    - Строка                   - Идентификатор базы данных                         - base
+//  Таблица - Строка                   - Идентификатор таблицы                             - table
+//  Записи  - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьМассив(Записи);
+    
+    СтрокаЗаписей = "";
+    
+    Для Каждого Запись Из Записи Цикл
+        СтрокаЗаписей = СтрокаЗаписей
+            + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?")
+            + "records[]="
+            + OPI_Инструменты.ЧислоВСтроку(Запись);    
+    КонецЦикла;
+    
+    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей;
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+
+    Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+    
+    Возврат Ответ;    
+       
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСКомментариями
+
+// Получить комментарии
+// Получает список комментариев к записи в таблице
+// 
+// Параметры:
+//  Токен   - Строка - Токен                                                         - token
+//  База    - Строка - Идентификатор базы данных                                     - base
+//  Таблица - Строка - Идентификатор таблицы                                         - table
+//  Запись  - Строка - Идентификатор записи в таблице                                - record
+//  Отступ  - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+    
+    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments";
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+     
+    Параметры  = Новый Структура();
+    OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
+        
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать комментарий
+// Создает комментарий к записи в таблице
+// 
+// Параметры:
+//  Токен   - Строка - Токен                           - token
+//  База    - Строка - Идентификатор базы данных       - base
+//  Таблица - Строка - Идентификатор таблицы           - table
+//  Запись  - Строка - Идентификатор записи в таблице  - record
+//  Текст   - Строка - Текст комментария               - text
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+    
+    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments";
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+     
+    Параметры  = Новый Структура();
+    OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры);
+        
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Изменить комментарий
+// Изменяет текст существующего комментария
+// 
+// Параметры:
+//  Токен       - Строка - Токен                           - token
+//  База        - Строка - Идентификатор базы данных       - base
+//  Таблица     - Строка - Идентификатор таблицы           - table
+//  Запись      - Строка - Идентификатор записи в таблице  - record
+//  Комментарий - Строка - Идентификатор комментария       - comment
+//  Текст       - Строка - Новый текст комментария         - text
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
+    
+    URL        = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий;
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+     
+    Параметры  = Новый Структура();
+    OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры);
+        
+    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить комментарий
+// Удаляет комментарий к записи таблицы
+// 
+// Параметры:
+//  Токен       - Строка - Токен                           - token
+//  База        - Строка - Идентификатор базы данных       - base
+//  Таблица     - Строка - Идентификатор таблицы           - table
+//  Запись      - Строка - Идентификатор записи в таблице  - record
+//  Комментарий - Строка - Идентификатор комментария       - comment
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable 
+Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
+    
+    URL       = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий;
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+        
+    Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+    
+    Возврат Ответ;
+        
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьЗаголовокАвторизации(Знач Токен)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Заголовки = Новый Соответствие;
+    Заголовки.Вставить("Authorization", "Bearer " + Токен);
+    
+    Возврат Заголовки;
+    
+КонецФункции
+
+Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "")
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей);
+    
+    ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей);
+    
+    OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы);
+    
+    Возврат ОписаниеТаблицы;
+    
+КонецФункции
+
+Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "")
+    
+    СтруктураПоля = Новый Структура();
+    OPI_Инструменты.ДобавитьПоле("name"   , Наименование, "Строка"   , СтруктураПоля);
+    OPI_Инструменты.ДобавитьПоле("type"   , Тип         , "Строка"   , СтруктураПоля);
+    OPI_Инструменты.ДобавитьПоле("options", Опции       , "Коллекция", СтруктураПоля);
+    
+    Возврат СтруктураПоля;
+
+КонецФункции
+
+Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры)
+    
+    Если ТипЗнч(Данные) = Тип("Массив") Тогда
+        
+        МассивОтправки = Новый Массив;
+        
+        Для Каждого ОписаниеЗаписи Из Данные Цикл
+            МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи));    
+        КонецЦикла;
+        
+        OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры);
+        
+    Иначе
+       
+       OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры); 
+       
+    КонецЕсли;
+        
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Dropbox.os b/src/ru/OInt/core/Modules/OPI_Dropbox.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_Dropbox.os
rename to src/ru/OInt/core/Modules/OPI_Dropbox.os
index ec50f865c9..86abd31dc9 100644
--- a/ru/OInt/core/Modules/OPI_Dropbox.os
+++ b/src/ru/OInt/core/Modules/OPI_Dropbox.os
@@ -1,961 +1,961 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os
-// Библиотека: Dropbox
-// Команда CLI: dropbox
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область АккаунтИАвторизация
-
-// Получить ссылку авторизации
-// Генерирует ссылку авторизации для перехода в браузере
-// 
-// Параметры:
-//  КлючПриложения - Строка - Ключ приложения - appkey
-// 
-// Возвращаемое значение:
-//  Строка - URL для перехода в браузере
-Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения);
-    Возврат "https://www.dropbox.com/oauth2/authorize?client_id=" 
-        + КлючПриложения 
-        + "&response_type=code&token_access_type=offline";
-    
-КонецФункции
-
-// Получить токен
-// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации
-// 
-// Параметры:
-//  КлючПриложения   - Строка - Ключ приложения             - appkey
-//  СекретПриложения - Строка - Секрет приложения           - appsecret
-//  Код              - Строка - Код со страницы авторизации - code
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт
-    
-    URL       = "https://api.dropbox.com/oauth2/token";
-    ТипДанных = "application/x-www-form-urlencoded; charset=utf-8";
-    
-    Параметры = Новый Структура;                  
-    OPI_Инструменты.ДобавитьПоле("code"      , Код                 , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры);
-    
-    СтруктураURL  = OPI_Инструменты.РазбитьURL(URL);
-    Сервер        = СтруктураURL["Сервер"];
-    Адрес         = СтруктураURL["Адрес"];
-    
-    Запрос        = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных);
-    Соединение    = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения);
-
-    СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
-    Данные           = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
-
-    Запрос.УстановитьТелоИзСтроки(Данные);
-    
-    Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
-    OPI_Инструменты.ОбработатьОтвет(Ответ);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Обновить токен
-// Получает новый токен на основе рефреш токена
-// 
-// Параметры:
-//  КлючПриложения   - Строка - Ключ приложения   - appkey
-//  СекретПриложения - Строка - Секрет приложения - appsecret
-//  РефрешТокен      - Строка - Рефреш токен      - refresh
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт
-    
-    Строка_ = "Строка";
-    URL     = "https://api.dropbox.com/oauth2/token";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен     , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("grant_type"   , "refresh_token" , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("client_id"    , КлючПриложения  , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, Строка_, Параметры);
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить информацию об аккаунте
-// Получает информацию об аккаунте
-// 
-// Параметры:
-//  Токен   - Строка - Токен                                                  - token
-//  Аккаунт - Строка - ID аккаунта. Текущий аккаунт токена, если не заполнено - account
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьИнформациюОбАккаунте(Знач Токен, Знач Аккаунт = "") Экспорт
-    
-    Если ЗначениеЗаполнено(Аккаунт) Тогда
-        Результат = ПолучитьАккаунт(Токен, Аккаунт);
-    Иначе
-        Результат = ПолучитьСвойАккаунт(Токен);
-    КонецЕсли;
-    
-    Возврат Результат;
-    
-КонецФункции
-
-// Получить данные использования пространства
-// Получает информацию о количестве использованного дискового пространства
-// 
-// Параметры:
-//  Токен - Строка - Токен - token 
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьДанныеИспользованияПространства(Знач Токен) Экспорт
-    
-    URL       = "https://api.dropboxapi.com/2/users/get_space_usage";
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    
-    Ответ = OPI_Инструменты.PostBinary(URL
-        , ПолучитьДвоичныеДанныеИзСтроки("null")
-        , Заголовки
-        , 
-        , "text/plain; charset=dropbox-cors-hack"); 
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСФайламиИКаталогами
-
-// Получить информацию об объекте
-// Получает информацию о файле или каталоге
-// 
-// Параметры:
-//  Токен    - Строка - Токен                                                    - token
-//  Путь     - Строка - Путь к объекту                                           - path
-//  Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail 
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox 
-Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Путь, Знач Подробно = Ложь) Экспорт
-    
-    URL = "https://api.dropboxapi.com/2/files/get_metadata"; 
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("path"              , Путь    , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно, "Булево", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить список файлов папки
-// Получает список первых файлов каталога или продолжает получение следующих при указании курсора
-// 
-// Параметры:
-//  Токен    - Строка - Токен                                                                - token
-//  Путь     - Строка - Путь к каталогу. Необязателен, если указан курсор                    - path
-//  Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов             - detail
-//  Курсор   - Строка - Курсор из предыдущего запроса для получения следующего набора файлов - cursor
-// 
-// Возвращаемое значение:
-//  HTTPОтвет - Получить список файлов папки
-Функция ПолучитьСписокФайловПапки(Знач Токен, Знач Путь = "", Знач Подробно = Ложь, Знач Курсор = "") Экспорт
-    
-    Если Не ЗначениеЗаполнено(Курсор) Тогда
-        
-        URL = "https://api.dropboxapi.com/2/files/list_folder";
-        
-        Параметры = Новый Структура;
-        OPI_Инструменты.ДобавитьПоле("path"              , Путь      , "Строка", Параметры);
-        OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно  , "Булево", Параметры);
-    
-    Иначе
-        
-        URL = "https://api.dropboxapi.com/2/files/list_folder/continue";
-        
-        Параметры = Новый Структура;
-        OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); 
-        
-    КонецЕсли;
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить превью
-// Получает PDF или HTML превью объекта (только для токументов)
-// 
-// Параметры:
-//  Токен - Строка - Токен          - token
-//  Путь  - Строка - Путь к объекту - path
-// 
-// Возвращаемое значение:
-//  ДвоичныеДанные - превью документа 
-Функция ПолучитьПревью(Знач Токен, Знач Путь) Экспорт
-    
-    URL   = "https://content.dropboxapi.com/2/files/get_preview";
-    Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Загрузить файл
-// Загружает файл на облачный диск
-// 
-// Параметры:
-//  Токен          - Строка                 - Токен                                   - token
-//  Файл           - Строка, ДвоичныеДанные - Данные файл для загрузки                - file
-//  Путь           - Строка                 - Путь сохранения на Dropbox              - path
-//  Перезаписывать - Булево                 - Перезаписывать файл при конфликте путей - overwrite
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox 
-Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    
-    Режим     = ?(Перезаписывать, "overwrite", "add");
-    Размер    = Файл.Размер();
-    Граница   = 100000000;
-        
-    Если Размер > Граница Тогда
-        Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
-    Иначе
-        Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим);
-    КонецЕсли;
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Загрузить файл по URL
-// Загружает файл на облачный диск, получая его по указанному URL 
-// 
-// Параметры:
-//  Токен    - Строка - Токен                      - token
-//  URLФайла - Строка - URL источник файла         - url
-//  Путь     - Строка - Путь сохранения на Dropbox - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ЗагрузитьФайлПоURL(Знач Токен, Знач URLФайла, Знач Путь) Экспорт
-    
-    URL = "https://api.dropboxapi.com/2/files/save_url"; 
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("path", Путь     , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("url" , URLФайла , "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить статус загрузки по URL
-// Получает статус загрузки файла по URL
-// 
-// Параметры:
-//  Токен    - Строка - Токен                                              - token
-//  IDРаботы - Строка - ID асинхронной работы из ответа ЗагрузитьФайлПоURL - job 
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьСтатусЗагрузкиПоURL(Знач Токен, Знач IDРаботы) Экспорт
-    
-    URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status"; 
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить объект
-// Удаляет объект с облачного диска
-// 
-// Параметры:
-//  Токен        - Строка - Токен                                        - token
-//  Путь         - Строка - Путь к объекту удаления                      - path
-//  БезВозвратно - Строка - Удалить объект без возможности востановления - permanently
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач Безвозвратно = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Безвозвратно);
-    
-    Если Безвозвратно Тогда
-        URL = "https://api.dropboxapi.com/2/files/permanently_delete";
-    Иначе
-        URL = "https://api.dropboxapi.com/2/files/delete_v2";
-    КонецЕсли;
-    
-    Ответ = ОбработатьОбъект(Токен, URL, Путь);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Копировать объект
-// Копирует файл или каталог по выбранному пути
-// 
-// Параметры:
-//  Токен  - Строка - Токен                           - token
-//  Откуда - Строка - Путь к объекту оригинала        - form
-//  Куда   - Строка - Целевой путь для нового объекта - to
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция КопироватьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт
-   
-    URL = "https://api.dropboxapi.com/2/files/copy_v2";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("to_path"  , Куда  , "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-     
-КонецФункции
-
-// Переместить объект
-// Перемещает объект по выбранному пути
-// 
-// Параметры:
-//  Токен  - Строка - Токен                           - token
-//  Откуда - Строка - Путь к объекту оригинала        - form
-//  Куда   - Строка - Целевой путь для нового объекта - to
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПереместитьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт
-
-    URL = "https://api.dropboxapi.com/2/files/move_v2";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("to_path"  , Куда  , "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-        
-КонецФункции
-
-// Создать папку
-// Создает пустой каталог по выбранному пути
-// 
-// Параметры:
-//  Токен - Строка - Токен                          - token
-//  Путь  - Строка - Целевой путь создания каталога - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
-    
-    URL   = "https://api.dropboxapi.com/2/files/create_folder_v2";
-    Ответ = ОбработатьОбъект(Токен, URL, Путь);
-    
-    Возврат Ответ;
-     
-КонецФункции
-
-// Скачать файл
-// Скачивает файл по указанному пути или ID
-// 
-// Параметры:
-//  Токен - Строка - Токен             - token
-//  Путь  - Строка - Путь или ID файла - path
-// 
-// Возвращаемое значение:
-//  ДвоичныеДанные - двоичные данные файла
-Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт
-    
-    URL   = "https://content.dropboxapi.com/2/files/download";
-    Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Скачать папку
-// Скачивает zip архив с содержимым указанного каталога
-// 
-// Параметры:
-//  Токен - Строка - Токен                - token
-//  Путь  - Строка - Путь или ID каталога - path
-// 
-// Возвращаемое значение:
-//  ДвоичныеДанные - двоичные данные zip архива с содержимым каталога
-Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт
-    
-    URL   = "https://content.dropboxapi.com/2/files/download_zip";
-    Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить список версий объекта
-// Получает список версий (ревизий) объекта
-// 
-// Параметры:
-//  Токен      - Строка        - Токен                                          - token
-//  Путь       - Строка        - Путь к объекту                                 - path
-//  Количество - Строка, Число - Число последних версий объекта для отображения - amount
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьСписокВерсийОбъекта(Знач Токен, Знач Путь, Знач Количество = 10) Экспорт
-    
-    URL = "https://api.dropboxapi.com/2/files/list_revisions"; 
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("path" , Путь      , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("limit", Количество, "Число" , Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Восстановить объект к версии
-// Восстанавливает состояние объекта к необходимой версии (ревизии)
-// 
-// Параметры:
-//  Токен  - Строка - Токен                                 - token
-//  Путь   - Строка - Путь к объекту                        - path
-//  Версия - Строка - ID версии (ревизии) для востановления - rev
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ВосстановитьОбъектКВерсии(Знач Токен, Знач Путь, Знач Версия) Экспорт
-    
-    URL = "https://api.dropboxapi.com/2/files/restore"; 
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("path", Путь  , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("rev" , Версия, "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСТегами
-
-// Получить список тегов
-// Получает список тегов выбранных файлов
-// 
-// Параметры:
-//  Токен - Строка                   - Токен                          - token
-//  Пути  - Строка, Массив Из Строка - Путь или набору путей к файлам - paths
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьСписокТегов(Знач Токен, Знач Пути) Экспорт
-    
-    URL = "https://api.dropboxapi.com/2/files/tags/get";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("paths", Пути, "Массив", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Добавить тег
-// Добавляет новый текстовый тег к файлу или каталогу
-// 
-// Параметры:
-//  Токен - Строка - Токен                                               - token
-//  Путь  - Строка - Путь к объекту, для которого необходимо создать тег - path
-//  Тег   - Строка - Текст тега                                          - tag
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ДобавитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт
-    
-    Возврат ОбработатьТег(Токен, Путь, Тег);
-    
-КонецФункции
-
-// Удалить тег
-// Удаляет текстовый тег файла или каталога
-// 
-// Параметры:
-//  Токен - Строка - Токен                                           - token
-//  Путь  - Строка - Путь к объекту, тег которого необходимо удалить - path
-//  Тег   - Строка - Текст тега                                      - tag
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция УдалитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт
-    
-    Возврат ОбработатьТег(Токен, Путь, Тег, Истина);
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область НастройкиСовместногоДоступа
-
-// Опубликовать папку
-// Переводит каталог в режим публичного доступа
-// 
-// Параметры:
-//  Токен - Строка - Токен                    - token
-//  Путь  - Строка - Путь к целевому каталогу - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ОпубликоватьПапку(Знач Токен, Знач Путь) Экспорт
-    
-    URL   = "https://api.dropboxapi.com/2/sharing/share_folder";
-    Ответ = ОбработатьОбъект(Токен, URL, Путь);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Отменить публикацию папки
-// Отменяет режим общего доступа для каталога
-// 
-// Параметры:
-//  Токен   - Строка - Токен                                     - token
-//  IDПапки - Строка - ID публичного каталога (shared folder ID) - folder
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ОтменитьПубликациюПапки(Знач Токен, Знач IDПапки) Экспорт
-    
-    URL = "https://api.dropboxapi.com/2/sharing/unshare_folder";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки, "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Добавить пользователя к файлу
-// Определяет доступ к файлу для стороннего пользователя
-// 
-// Параметры:
-//  Токен          - Строка                   - Токен                                                      - token
-//  IDФайла        - Строка                   - ID файла, к которому предоставляется доступ                - fileid
-//  АдресаПочты    - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей             - emails
-//  ТолькоПросмотр - Булево                   - Запрещает редактирование файла для стороннего пользователя - readonly
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ДобавитьПользователейКФайлу(Знач Токен, Знач IDФайла, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт
-    
-    Строка_ = "Строка";
-    
-    OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр);
-    
-    Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда
-        IDФайла = "id:" + IDФайла;
-    КонецЕсли;
-    
-    URL = "https://api.dropboxapi.com/2/sharing/add_file_member";
-    
-    МассивПользователей = Новый Массив;
-    
-    Для Каждого Адрес Из АдресаПочты Цикл
-             
-        ДанныеПользователя = Новый Соответствие;
-        OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя);
-        OPI_Инструменты.ДобавитьПоле("email", Адрес  , Строка_, ДанныеПользователя);
-        
-        МассивПользователей.Добавить(ДанныеПользователя);
-
-    КонецЦикла;
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("file"   , IDФайла             , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("members", МассивПользователей , "Массив", Параметры);
-    
-    Режим = ?(ТолькоПросмотр, "viewer", "editor");
-    
-    OPI_Инструменты.ДобавитьПоле("access_level", Режим , Строка_, Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Добавить пользователей к папке
-// Предоставляет стороннии пользователям доступ к каталогу
-// 
-// Параметры:
-//  Токен          - Строка - Токен                                                            - token
-//  IDПапки        - Строка - ID публичного каталога (shared folder ID)                        - folder
-//  АдресаПочты    - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails
-//  ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя       - readonly
-// 
-// Возвращаемое значение:
-//  Неопределено - пустой ответ
-Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт
-    
-    Строка_ = "Строка";
-    
-    OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр);
-    Режим = ?(ТолькоПросмотр, "viewer", "editor");
-        
-    URL = "https://api.dropboxapi.com/2/sharing/add_folder_member";
-    
-    МассивПользователей = Новый Массив;
-    
-    Для Каждого Адрес Из АдресаПочты Цикл
-             
-        ДанныеПользователя = Новый Соответствие;
-        OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя);
-        OPI_Инструменты.ДобавитьПоле("email", Адрес  , Строка_, ДанныеПользователя);
-        
-        СтруктураПользователя = Новый Структура("member,access_level", ДанныеПользователя, Режим); 
-        
-        МассивПользователей.Добавить(СтруктураПользователя);
-
-    КонецЦикла;
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки             , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("members"         , МассивПользователей , "Массив", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить статус асинхронного изменения
-// Получает статус асинхронной работы по изменению доступов
-// 
-// Параметры:
-//  Токен    - Строка - Токен                 - token
-//  IDРаботы - Строка - ID асинхронной работы - job
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьСтатусАсинхронногоИзменения(Знач Токен, Знач IDРаботы) Экспорт
-    
-    URL = "https://api.dropboxapi.com/2/sharing/check_job_status";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Отменить публикацию файла
-// Запрещает доступ к файлу для внешних пользователей
-// 
-// Параметры:
-//  Токен    - Строка - Токен                                       - token
-//  IDФайла  - Строка - ID файла, к которому предоставляется доступ - fileid
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ОтменитьПубликациюФайла(Знач Токен, Знач IDФайла) Экспорт
-	
-	OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
-    
-    Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда
-        IDФайла = "id:" + IDФайла;
-    КонецЕсли;
-    
-	URL = "https://api.dropboxapi.com/2/sharing/unshare_file";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("file", IDФайла, "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь)
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры);
-    
-    Если ВЗаголовках Тогда
-        Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
-        Ответ     = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
-    Иначе
-        Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-        Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    КонецЕсли;
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ОбработатьТег(Знач Токен, Знач Путь, Знач Тег, Знач ЭтоУдаление = Ложь)
-
-    Если ЭтоУдаление Тогда
-        URL = "https://api.dropboxapi.com/2/files/tags/remove";
-    Иначе
-        URL = "https://api.dropboxapi.com/2/files/tags/add";
-    КонецЕсли;
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("path"     , Путь, "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("tag_text" , Тег , "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-        
-КонецФункции
-
-Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "")
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-        
-    Заголовки = Новый Соответствие;
-    Заголовки.Вставить("Authorization"  , "Bearer " + Токен);
-    
-    Если ЗначениеЗаполнено(Параметры) Тогда
-        
-        JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет");
-        JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, "");
-
-        Заголовки.Вставить("Dropbox-API-Arg", JSON);
-    
-    КонецЕсли;
-    
-    Возврат Заголовки;
-    
-КонецФункции
-
-Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
-    
-    URL            = "https://content.dropboxapi.com/2/files/upload_session/append_v2"; 
-
-    РазмерЧасти    = 100000000;
-    ТекущаяПозиция = 0;
-    ПрочитаноБайт  = 0;
-    ОбщийРазмер    = Файл.Размер();   
-    Сессия         = ОткрытьСессию(Токен);
-    
-    Пока ПрочитаноБайт < ОбщийРазмер Цикл
-        
-        Отступ = ТекущаяПозиция;
-        Курсор = Новый Структура("offset,session_id", Отступ, Сессия);
-        
-        Параметры = Новый Структура("cursor", Курсор);
-        Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
-        
-        ЧтениеДанных     = Новый ЧтениеДанных(Файл);
-        ПрочитаноБайт    = ЧтениеДанных.Пропустить(ТекущаяПозиция);
-        Результат        = ЧтениеДанных.Прочитать(РазмерЧасти);
-        ТекущиеДанные    = Результат.ПолучитьДвоичныеДанные();
-        РазмерТекущих    = ТекущиеДанные.Размер();
-        СледующаяПозиция = ТекущаяПозиция + РазмерТекущих; 
-        
-        Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
-            Прервать;
-        КонецЕсли;
-
-        Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки);
-        
-        ТекущаяПозиция = СледующаяПозиция;
-        
-        КБайт = 1024;
-        МБайт = КБайт * КБайт;
-        Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
-        
-        ВыполнитьСборкуМусора();
-        ОсвободитьОбъект(ТекущиеДанные);
-               
-    КонецЦикла;
-    
-    Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
-    
-    Возврат Ответ;
-        
-КонецФункции
-
-Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
-    
-    Булево_ = "Булево";
-    Строка_ = "Строка";
-    URL     = "https://content.dropboxapi.com/2/files/upload";
-    
-    Параметры = Новый Структура;
-        
-    OPI_Инструменты.ДобавитьПоле("autorename"     , Ложь , Булево_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("mode"           , Режим, Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("mute"           , Ложь , Булево_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("path"           , Путь , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , Булево_, Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
-
-    Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ОткрытьСессию(Знач Токен)
-    
-    SessionId = "session_id";
-    URL       = "https://content.dropboxapi.com/2/files/upload_session/start";
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    
-    Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); 
-    
-    Возврат Ответ[SessionId];
-    
-КонецФункции
-
-Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия)
-
-    URL = "https://content.dropboxapi.com/2/files/upload_session/finish";
-    
-    Коммит = Новый Структура();
-    OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит);
-    OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит);   
-    
-    Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия);
-     
-    Параметры = Новый Структура("commit,cursor", Коммит, Курсор);
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
-    
-    Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ПолучитьАккаунт(Знач Токен, Знач Аккаунт)
-    
-    URL = "https://api.dropboxapi.com/2/users/get_account";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("account_id", Аккаунт, "Строка", Параметры);
-    
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-        
-КонецФункции
-
-Функция ПолучитьСвойАккаунт(Знач Токен)
-    
-    URL       = "https://api.dropboxapi.com/2/users/get_current_account";
-    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-    
-    Ответ = OPI_Инструменты.PostBinary(URL
-        , ПолучитьДвоичныеДанныеИзСтроки("null")
-        , Заголовки
-        , 
-        , "text/plain; charset=dropbox-cors-hack"); 
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os
+// Библиотека: Dropbox
+// Команда CLI: dropbox
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область АккаунтИАвторизация
+
+// Получить ссылку авторизации
+// Генерирует ссылку авторизации для перехода в браузере
+// 
+// Параметры:
+//  КлючПриложения - Строка - Ключ приложения - appkey
+// 
+// Возвращаемое значение:
+//  Строка - URL для перехода в браузере
+Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения);
+    Возврат "https://www.dropbox.com/oauth2/authorize?client_id=" 
+        + КлючПриложения 
+        + "&response_type=code&token_access_type=offline";
+    
+КонецФункции
+
+// Получить токен
+// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации
+// 
+// Параметры:
+//  КлючПриложения   - Строка - Ключ приложения             - appkey
+//  СекретПриложения - Строка - Секрет приложения           - appsecret
+//  Код              - Строка - Код со страницы авторизации - code
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт
+    
+    URL       = "https://api.dropbox.com/oauth2/token";
+    ТипДанных = "application/x-www-form-urlencoded; charset=utf-8";
+    
+    Параметры = Новый Структура;                  
+    OPI_Инструменты.ДобавитьПоле("code"      , Код                 , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры);
+    
+    СтруктураURL  = OPI_Инструменты.РазбитьURL(URL);
+    Сервер        = СтруктураURL["Сервер"];
+    Адрес         = СтруктураURL["Адрес"];
+    
+    Запрос        = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных);
+    Соединение    = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения);
+
+    СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
+    Данные           = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
+
+    Запрос.УстановитьТелоИзСтроки(Данные);
+    
+    Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
+    OPI_Инструменты.ОбработатьОтвет(Ответ);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Обновить токен
+// Получает новый токен на основе рефреш токена
+// 
+// Параметры:
+//  КлючПриложения   - Строка - Ключ приложения   - appkey
+//  СекретПриложения - Строка - Секрет приложения - appsecret
+//  РефрешТокен      - Строка - Рефреш токен      - refresh
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт
+    
+    Строка_ = "Строка";
+    URL     = "https://api.dropbox.com/oauth2/token";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен     , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("grant_type"   , "refresh_token" , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("client_id"    , КлючПриложения  , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, Строка_, Параметры);
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить информацию об аккаунте
+// Получает информацию об аккаунте
+// 
+// Параметры:
+//  Токен   - Строка - Токен                                                  - token
+//  Аккаунт - Строка - ID аккаунта. Текущий аккаунт токена, если не заполнено - account
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьИнформациюОбАккаунте(Знач Токен, Знач Аккаунт = "") Экспорт
+    
+    Если ЗначениеЗаполнено(Аккаунт) Тогда
+        Результат = ПолучитьАккаунт(Токен, Аккаунт);
+    Иначе
+        Результат = ПолучитьСвойАккаунт(Токен);
+    КонецЕсли;
+    
+    Возврат Результат;
+    
+КонецФункции
+
+// Получить данные использования пространства
+// Получает информацию о количестве использованного дискового пространства
+// 
+// Параметры:
+//  Токен - Строка - Токен - token 
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьДанныеИспользованияПространства(Знач Токен) Экспорт
+    
+    URL       = "https://api.dropboxapi.com/2/users/get_space_usage";
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    
+    Ответ = OPI_Инструменты.PostBinary(URL
+        , ПолучитьДвоичныеДанныеИзСтроки("null")
+        , Заголовки
+        , 
+        , "text/plain; charset=dropbox-cors-hack"); 
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСФайламиИКаталогами
+
+// Получить информацию об объекте
+// Получает информацию о файле или каталоге
+// 
+// Параметры:
+//  Токен    - Строка - Токен                                                    - token
+//  Путь     - Строка - Путь к объекту                                           - path
+//  Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail 
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox 
+Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Путь, Знач Подробно = Ложь) Экспорт
+    
+    URL = "https://api.dropboxapi.com/2/files/get_metadata"; 
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("path"              , Путь    , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно, "Булево", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить список файлов папки
+// Получает список первых файлов каталога или продолжает получение следующих при указании курсора
+// 
+// Параметры:
+//  Токен    - Строка - Токен                                                                - token
+//  Путь     - Строка - Путь к каталогу. Необязателен, если указан курсор                    - path
+//  Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов             - detail
+//  Курсор   - Строка - Курсор из предыдущего запроса для получения следующего набора файлов - cursor
+// 
+// Возвращаемое значение:
+//  HTTPОтвет - Получить список файлов папки
+Функция ПолучитьСписокФайловПапки(Знач Токен, Знач Путь = "", Знач Подробно = Ложь, Знач Курсор = "") Экспорт
+    
+    Если Не ЗначениеЗаполнено(Курсор) Тогда
+        
+        URL = "https://api.dropboxapi.com/2/files/list_folder";
+        
+        Параметры = Новый Структура;
+        OPI_Инструменты.ДобавитьПоле("path"              , Путь      , "Строка", Параметры);
+        OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно  , "Булево", Параметры);
+    
+    Иначе
+        
+        URL = "https://api.dropboxapi.com/2/files/list_folder/continue";
+        
+        Параметры = Новый Структура;
+        OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры); 
+        
+    КонецЕсли;
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить превью
+// Получает PDF или HTML превью объекта (только для токументов)
+// 
+// Параметры:
+//  Токен - Строка - Токен          - token
+//  Путь  - Строка - Путь к объекту - path
+// 
+// Возвращаемое значение:
+//  ДвоичныеДанные - превью документа 
+Функция ПолучитьПревью(Знач Токен, Знач Путь) Экспорт
+    
+    URL   = "https://content.dropboxapi.com/2/files/get_preview";
+    Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Загрузить файл
+// Загружает файл на облачный диск
+// 
+// Параметры:
+//  Токен          - Строка                 - Токен                                   - token
+//  Файл           - Строка, ДвоичныеДанные - Данные файл для загрузки                - file
+//  Путь           - Строка                 - Путь сохранения на Dropbox              - path
+//  Перезаписывать - Булево                 - Перезаписывать файл при конфликте путей - overwrite
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox 
+Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    
+    Режим     = ?(Перезаписывать, "overwrite", "add");
+    Размер    = Файл.Размер();
+    Граница   = 100000000;
+        
+    Если Размер > Граница Тогда
+        Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
+    Иначе
+        Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим);
+    КонецЕсли;
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Загрузить файл по URL
+// Загружает файл на облачный диск, получая его по указанному URL 
+// 
+// Параметры:
+//  Токен    - Строка - Токен                      - token
+//  URLФайла - Строка - URL источник файла         - url
+//  Путь     - Строка - Путь сохранения на Dropbox - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ЗагрузитьФайлПоURL(Знач Токен, Знач URLФайла, Знач Путь) Экспорт
+    
+    URL = "https://api.dropboxapi.com/2/files/save_url"; 
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("path", Путь     , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("url" , URLФайла , "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить статус загрузки по URL
+// Получает статус загрузки файла по URL
+// 
+// Параметры:
+//  Токен    - Строка - Токен                                              - token
+//  IDРаботы - Строка - ID асинхронной работы из ответа ЗагрузитьФайлПоURL - job 
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьСтатусЗагрузкиПоURL(Знач Токен, Знач IDРаботы) Экспорт
+    
+    URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status"; 
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить объект
+// Удаляет объект с облачного диска
+// 
+// Параметры:
+//  Токен        - Строка - Токен                                        - token
+//  Путь         - Строка - Путь к объекту удаления                      - path
+//  БезВозвратно - Строка - Удалить объект без возможности востановления - permanently
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач Безвозвратно = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Безвозвратно);
+    
+    Если Безвозвратно Тогда
+        URL = "https://api.dropboxapi.com/2/files/permanently_delete";
+    Иначе
+        URL = "https://api.dropboxapi.com/2/files/delete_v2";
+    КонецЕсли;
+    
+    Ответ = ОбработатьОбъект(Токен, URL, Путь);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Копировать объект
+// Копирует файл или каталог по выбранному пути
+// 
+// Параметры:
+//  Токен  - Строка - Токен                           - token
+//  Откуда - Строка - Путь к объекту оригинала        - form
+//  Куда   - Строка - Целевой путь для нового объекта - to
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция КопироватьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт
+   
+    URL = "https://api.dropboxapi.com/2/files/copy_v2";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("to_path"  , Куда  , "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+     
+КонецФункции
+
+// Переместить объект
+// Перемещает объект по выбранному пути
+// 
+// Параметры:
+//  Токен  - Строка - Токен                           - token
+//  Откуда - Строка - Путь к объекту оригинала        - form
+//  Куда   - Строка - Целевой путь для нового объекта - to
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПереместитьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт
+
+    URL = "https://api.dropboxapi.com/2/files/move_v2";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("to_path"  , Куда  , "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+        
+КонецФункции
+
+// Создать папку
+// Создает пустой каталог по выбранному пути
+// 
+// Параметры:
+//  Токен - Строка - Токен                          - token
+//  Путь  - Строка - Целевой путь создания каталога - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
+    
+    URL   = "https://api.dropboxapi.com/2/files/create_folder_v2";
+    Ответ = ОбработатьОбъект(Токен, URL, Путь);
+    
+    Возврат Ответ;
+     
+КонецФункции
+
+// Скачать файл
+// Скачивает файл по указанному пути или ID
+// 
+// Параметры:
+//  Токен - Строка - Токен             - token
+//  Путь  - Строка - Путь или ID файла - path
+// 
+// Возвращаемое значение:
+//  ДвоичныеДанные - двоичные данные файла
+Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт
+    
+    URL   = "https://content.dropboxapi.com/2/files/download";
+    Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Скачать папку
+// Скачивает zip архив с содержимым указанного каталога
+// 
+// Параметры:
+//  Токен - Строка - Токен                - token
+//  Путь  - Строка - Путь или ID каталога - path
+// 
+// Возвращаемое значение:
+//  ДвоичныеДанные - двоичные данные zip архива с содержимым каталога
+Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт
+    
+    URL   = "https://content.dropboxapi.com/2/files/download_zip";
+    Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить список версий объекта
+// Получает список версий (ревизий) объекта
+// 
+// Параметры:
+//  Токен      - Строка        - Токен                                          - token
+//  Путь       - Строка        - Путь к объекту                                 - path
+//  Количество - Строка, Число - Число последних версий объекта для отображения - amount
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьСписокВерсийОбъекта(Знач Токен, Знач Путь, Знач Количество = 10) Экспорт
+    
+    URL = "https://api.dropboxapi.com/2/files/list_revisions"; 
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("path" , Путь      , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("limit", Количество, "Число" , Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Восстановить объект к версии
+// Восстанавливает состояние объекта к необходимой версии (ревизии)
+// 
+// Параметры:
+//  Токен  - Строка - Токен                                 - token
+//  Путь   - Строка - Путь к объекту                        - path
+//  Версия - Строка - ID версии (ревизии) для востановления - rev
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ВосстановитьОбъектКВерсии(Знач Токен, Знач Путь, Знач Версия) Экспорт
+    
+    URL = "https://api.dropboxapi.com/2/files/restore"; 
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("path", Путь  , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("rev" , Версия, "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСТегами
+
+// Получить список тегов
+// Получает список тегов выбранных файлов
+// 
+// Параметры:
+//  Токен - Строка                   - Токен                          - token
+//  Пути  - Строка, Массив Из Строка - Путь или набору путей к файлам - paths
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьСписокТегов(Знач Токен, Знач Пути) Экспорт
+    
+    URL = "https://api.dropboxapi.com/2/files/tags/get";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("paths", Пути, "Массив", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Добавить тег
+// Добавляет новый текстовый тег к файлу или каталогу
+// 
+// Параметры:
+//  Токен - Строка - Токен                                               - token
+//  Путь  - Строка - Путь к объекту, для которого необходимо создать тег - path
+//  Тег   - Строка - Текст тега                                          - tag
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ДобавитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт
+    
+    Возврат ОбработатьТег(Токен, Путь, Тег);
+    
+КонецФункции
+
+// Удалить тег
+// Удаляет текстовый тег файла или каталога
+// 
+// Параметры:
+//  Токен - Строка - Токен                                           - token
+//  Путь  - Строка - Путь к объекту, тег которого необходимо удалить - path
+//  Тег   - Строка - Текст тега                                      - tag
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция УдалитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт
+    
+    Возврат ОбработатьТег(Токен, Путь, Тег, Истина);
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область НастройкиСовместногоДоступа
+
+// Опубликовать папку
+// Переводит каталог в режим публичного доступа
+// 
+// Параметры:
+//  Токен - Строка - Токен                    - token
+//  Путь  - Строка - Путь к целевому каталогу - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ОпубликоватьПапку(Знач Токен, Знач Путь) Экспорт
+    
+    URL   = "https://api.dropboxapi.com/2/sharing/share_folder";
+    Ответ = ОбработатьОбъект(Токен, URL, Путь);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Отменить публикацию папки
+// Отменяет режим общего доступа для каталога
+// 
+// Параметры:
+//  Токен   - Строка - Токен                                     - token
+//  IDПапки - Строка - ID публичного каталога (shared folder ID) - folder
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ОтменитьПубликациюПапки(Знач Токен, Знач IDПапки) Экспорт
+    
+    URL = "https://api.dropboxapi.com/2/sharing/unshare_folder";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки, "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Добавить пользователя к файлу
+// Определяет доступ к файлу для стороннего пользователя
+// 
+// Параметры:
+//  Токен          - Строка                   - Токен                                                      - token
+//  IDФайла        - Строка                   - ID файла, к которому предоставляется доступ                - fileid
+//  АдресаПочты    - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей             - emails
+//  ТолькоПросмотр - Булево                   - Запрещает редактирование файла для стороннего пользователя - readonly
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ДобавитьПользователейКФайлу(Знач Токен, Знач IDФайла, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт
+    
+    Строка_ = "Строка";
+    
+    OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр);
+    
+    Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда
+        IDФайла = "id:" + IDФайла;
+    КонецЕсли;
+    
+    URL = "https://api.dropboxapi.com/2/sharing/add_file_member";
+    
+    МассивПользователей = Новый Массив;
+    
+    Для Каждого Адрес Из АдресаПочты Цикл
+             
+        ДанныеПользователя = Новый Соответствие;
+        OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя);
+        OPI_Инструменты.ДобавитьПоле("email", Адрес  , Строка_, ДанныеПользователя);
+        
+        МассивПользователей.Добавить(ДанныеПользователя);
+
+    КонецЦикла;
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("file"   , IDФайла             , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("members", МассивПользователей , "Массив", Параметры);
+    
+    Режим = ?(ТолькоПросмотр, "viewer", "editor");
+    
+    OPI_Инструменты.ДобавитьПоле("access_level", Режим , Строка_, Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Добавить пользователей к папке
+// Предоставляет стороннии пользователям доступ к каталогу
+// 
+// Параметры:
+//  Токен          - Строка - Токен                                                            - token
+//  IDПапки        - Строка - ID публичного каталога (shared folder ID)                        - folder
+//  АдресаПочты    - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails
+//  ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя       - readonly
+// 
+// Возвращаемое значение:
+//  Неопределено - пустой ответ
+Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт
+    
+    Строка_ = "Строка";
+    
+    OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр);
+    Режим = ?(ТолькоПросмотр, "viewer", "editor");
+        
+    URL = "https://api.dropboxapi.com/2/sharing/add_folder_member";
+    
+    МассивПользователей = Новый Массив;
+    
+    Для Каждого Адрес Из АдресаПочты Цикл
+             
+        ДанныеПользователя = Новый Соответствие;
+        OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя);
+        OPI_Инструменты.ДобавитьПоле("email", Адрес  , Строка_, ДанныеПользователя);
+        
+        СтруктураПользователя = Новый Структура("member,access_level", ДанныеПользователя, Режим); 
+        
+        МассивПользователей.Добавить(СтруктураПользователя);
+
+    КонецЦикла;
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки             , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("members"         , МассивПользователей , "Массив", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить статус асинхронного изменения
+// Получает статус асинхронной работы по изменению доступов
+// 
+// Параметры:
+//  Токен    - Строка - Токен                 - token
+//  IDРаботы - Строка - ID асинхронной работы - job
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьСтатусАсинхронногоИзменения(Знач Токен, Знач IDРаботы) Экспорт
+    
+    URL = "https://api.dropboxapi.com/2/sharing/check_job_status";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Отменить публикацию файла
+// Запрещает доступ к файлу для внешних пользователей
+// 
+// Параметры:
+//  Токен    - Строка - Токен                                       - token
+//  IDФайла  - Строка - ID файла, к которому предоставляется доступ - fileid
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ОтменитьПубликациюФайла(Знач Токен, Знач IDФайла) Экспорт
+	
+	OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
+    
+    Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда
+        IDФайла = "id:" + IDФайла;
+    КонецЕсли;
+    
+	URL = "https://api.dropboxapi.com/2/sharing/unshare_file";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("file", IDФайла, "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь)
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры);
+    
+    Если ВЗаголовках Тогда
+        Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
+        Ответ     = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
+    Иначе
+        Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+        Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    КонецЕсли;
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ОбработатьТег(Знач Токен, Знач Путь, Знач Тег, Знач ЭтоУдаление = Ложь)
+
+    Если ЭтоУдаление Тогда
+        URL = "https://api.dropboxapi.com/2/files/tags/remove";
+    Иначе
+        URL = "https://api.dropboxapi.com/2/files/tags/add";
+    КонецЕсли;
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("path"     , Путь, "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("tag_text" , Тег , "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+        
+КонецФункции
+
+Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "")
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+        
+    Заголовки = Новый Соответствие;
+    Заголовки.Вставить("Authorization"  , "Bearer " + Токен);
+    
+    Если ЗначениеЗаполнено(Параметры) Тогда
+        
+        JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет");
+        JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, "");
+
+        Заголовки.Вставить("Dropbox-API-Arg", JSON);
+    
+    КонецЕсли;
+    
+    Возврат Заголовки;
+    
+КонецФункции
+
+Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
+    
+    URL            = "https://content.dropboxapi.com/2/files/upload_session/append_v2"; 
+
+    РазмерЧасти    = 100000000;
+    ТекущаяПозиция = 0;
+    ПрочитаноБайт  = 0;
+    ОбщийРазмер    = Файл.Размер();   
+    Сессия         = ОткрытьСессию(Токен);
+    
+    Пока ПрочитаноБайт < ОбщийРазмер Цикл
+        
+        Отступ = ТекущаяПозиция;
+        Курсор = Новый Структура("offset,session_id", Отступ, Сессия);
+        
+        Параметры = Новый Структура("cursor", Курсор);
+        Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
+        
+        ЧтениеДанных     = Новый ЧтениеДанных(Файл);
+        ПрочитаноБайт    = ЧтениеДанных.Пропустить(ТекущаяПозиция);
+        Результат        = ЧтениеДанных.Прочитать(РазмерЧасти);
+        ТекущиеДанные    = Результат.ПолучитьДвоичныеДанные();
+        РазмерТекущих    = ТекущиеДанные.Размер();
+        СледующаяПозиция = ТекущаяПозиция + РазмерТекущих; 
+        
+        Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
+            Прервать;
+        КонецЕсли;
+
+        Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки);
+        
+        ТекущаяПозиция = СледующаяПозиция;
+        
+        КБайт = 1024;
+        МБайт = КБайт * КБайт;
+        Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
+        
+        ВыполнитьСборкуМусора();
+        ОсвободитьОбъект(ТекущиеДанные);
+               
+    КонецЦикла;
+    
+    Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
+    
+    Возврат Ответ;
+        
+КонецФункции
+
+Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
+    
+    Булево_ = "Булево";
+    Строка_ = "Строка";
+    URL     = "https://content.dropboxapi.com/2/files/upload";
+    
+    Параметры = Новый Структура;
+        
+    OPI_Инструменты.ДобавитьПоле("autorename"     , Ложь , Булево_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("mode"           , Режим, Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("mute"           , Ложь , Булево_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("path"           , Путь , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , Булево_, Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
+
+    Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ОткрытьСессию(Знач Токен)
+    
+    SessionId = "session_id";
+    URL       = "https://content.dropboxapi.com/2/files/upload_session/start";
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    
+    Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки); 
+    
+    Возврат Ответ[SessionId];
+    
+КонецФункции
+
+Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия)
+
+    URL = "https://content.dropboxapi.com/2/files/upload_session/finish";
+    
+    Коммит = Новый Структура();
+    OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит);
+    OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит);   
+    
+    Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия);
+     
+    Параметры = Новый Структура("commit,cursor", Коммит, Курсор);
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
+    
+    Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ПолучитьАккаунт(Знач Токен, Знач Аккаунт)
+    
+    URL = "https://api.dropboxapi.com/2/users/get_account";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("account_id", Аккаунт, "Строка", Параметры);
+    
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+        
+КонецФункции
+
+Функция ПолучитьСвойАккаунт(Знач Токен)
+    
+    URL       = "https://api.dropboxapi.com/2/users/get_current_account";
+    Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+    
+    Ответ = OPI_Инструменты.PostBinary(URL
+        , ПолучитьДвоичныеДанныеИзСтроки("null")
+        , Заголовки
+        , 
+        , "text/plain; charset=dropbox-cors-hack"); 
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_GoogleCalendar.os b/src/ru/OInt/core/Modules/OPI_GoogleCalendar.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_GoogleCalendar.os
rename to src/ru/OInt/core/Modules/OPI_GoogleCalendar.os
index 639c88a94b..39655aaeb8 100644
--- a/ru/OInt/core/Modules/OPI_GoogleCalendar.os
+++ b/src/ru/OInt/core/Modules/OPI_GoogleCalendar.os
@@ -1,631 +1,631 @@
-// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os
-// Библиотека: Google Calendar
-// Команда CLI: gcalendar
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСМетаданнымиКалендарей
-
-// Создать календарь
-// Создает пустой календарь
-// 
-// Параметры:
-//  Токен        - Строка - Токен                                - token
-//  Наименование - Строка - Наименование создаваемого календаря  - title
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/calendars";
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("summary" , Наименование);
-    Параметры.Вставить("timeZone", "Europe/Moscow");
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить календарь
-// Получает информацию о календаре по ID
-// 
-// Параметры:
-//  Токен     - Строка - Токен        - token
-//  Календарь - Строка - ID календаря - calendar
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;    
-    Ответ     = OPI_Инструменты.Get(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Изменить календарь
-// Изменяет свойства существуещего календаря
-// 
-// Параметры:
-//  Токен        - Строка - Токен                      - token
-//  Календарь    - Строка - ID календаря               - calendar
-//  Наименование - Строка - Новое наименование         - title
-//  Описание     - Строка - Новое описание календаря   - description
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ИзменитьМетаданныеКалендаря(Знач Токен
-    , Знач Календарь
-    , Знач Наименование = ""
-    , Знач Описание = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
-    
-    Параметры = Новый Структура;
-    
-    Если ЗначениеЗаполнено(Наименование) Тогда
-        Параметры.Вставить("summary", Наименование);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Описание) Тогда
-        Параметры.Вставить("description", Описание);
-    КонецЕсли;
-      
-    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Очистить основной календарь
-// Очищает список событий основного календаря
-// 
-// Параметры:
-//  Токен - Строка - Токен - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/calendars/primary/clear";    
-    Ответ     = OPI_Инструменты.Post(URL, , Заголовки, Ложь);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Удалить календарь
-// Удаляет календарь по ID
-// 
-// Параметры:
-//  Токен     - Строка - Токен         - token
-//  Календарь - Строка - ID календаря  - calendar
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;       
-    Ответ     = OPI_Инструменты.Delete(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСоСпискомКалендарей
-
-// Получить список календарей
-// Получает массив календарей аккаунта
-// 
-// Параметры:
-//  Токен - Строка - Токен - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Массив соответствий данных календарей
-Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Заголовки        = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    МассивКалендарей = Новый Массив;
-    
-    ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей);
-    
-    Возврат МассивКалендарей;
-    
-КонецФункции
-
-// Добавить календарь в список
-// Добавляет существующий календарь в список пользователя
-// 
-// Параметры:
-//  Токен     - Строка - Токен        - token
-//  Календарь - Строка - ID календаря - calendar
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList";
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("id", Календарь);
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить календарь списка
-// Получает календарь из списка пользователя по ID
-// 
-// Параметры:
-//  Токен     - Строка - Токен        - token
-//  Календарь - Строка - ID календаря - calendar
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
-    Ответ     = OPI_Инструменты.Get(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Удалить календарь из списка
-// Удаляет календарь из списка пользователя
-// 
-// Параметры:
-//  Токен     - Строка - Токен         - token
-//  Календарь - Строка - ID календаря  - calendar
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
-    Ответ     = OPI_Инструменты.Delete(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Изменить календарь списка
-// Изменяет свойства календаря из списка пользователей
-// 
-// Параметры:
-//  Токен              - Строка - Токен                                   - token
-//  Календарь          - Строка - ID календаря                            - calendar
-//  ОсновнойЦвет       - Строка - HEX основного цвета (#ffffff)           - primary
-//  ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff)     - secondary
-//  Скрытый            - Булево - Скрытый календарь                       - hidden
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ИзменитьКалендарьСписка(Знач Токен
-    , Знач Календарь
-    , Знач ОсновнойЦвет
-    , Знач ДополнительныйЦвет
-    , Знач Скрытый = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true";
-    
-    Параметры = Новый Соответствие;
-    Параметры.Вставить("hidden"         , Скрытый);
-    Параметры.Вставить("foregroundColor", ОсновнойЦвет);
-    Параметры.Вставить("backgroundColor", ДополнительныйЦвет);
-    
-    Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаССобытиями
-
-// Получить описание события !NOCLI
-// 
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Пустой макет события
-Функция ПолучитьОписаниеСобытия() Экспорт
-    
-    ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
-    Час         = 3600;
-    Событие     = Новый Соответствие;
-                       
-    Событие.Вставить("Описание"               , "");                          // Описание события
-    Событие.Вставить("Заголовок"              , "Новое событие");             // Заголовок события
-    Событие.Вставить("МестоПроведения"        , "");                          // Строка описание места проведения
-    Событие.Вставить("ДатаНачала"             , ТекущаяДата);                 // Дата начала события
-    Событие.Вставить("ДатаОкончания"          , ТекущаяДата + Час);           // Дата окончания события
-    Событие.Вставить("МассивURLФайловВложений", Новый Соответствие);          // Ключ - название, Значение - URL к файлу
-    Событие.Вставить("ОтправлятьУведомления"  , Истина);                      // Признак отправки уведомлений участникам
-
-    Возврат Событие;
-    
-КонецФункции
-
-// Получить список событий
-// Получает список всех событий календаря
-// 
-// Параметры:
-//  Токен     - Строка - Токен         - token
-//  Календарь - Строка - ID календаря  - calendar
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Массив соответствий событий
-Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    
-    Заголовки     = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    МассивСобытий = Новый Массив;
-    
-    ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий);
-    
-    Возврат МассивСобытий;
-    
-КонецФункции
-
-// Получить событие
-// Получает событие по ID
-// 
-// Параметры:
-//  Токен     - Строка - Токен        - token
-//  Календарь - Строка - ID календаря - calendar
-//  Событие   - Строка - ID события   - event
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
-    
-    Заголовки   = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
-        + Календарь 
-        + "/events/"
-        + Событие; 
-        
-    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Создать событие
-// Создает новое событие
-// 
-// Параметры:
-//  Токен           - Строка                        - Токен            - token         
-//  Календарь       - Строка                        - ID календаря     - calendar
-//  ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props
-// 
-// Возвращаемое значение:
-//  Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
-Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт    
-    Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия);
-КонецФункции
-
-// Переместить событие
-// Перемещает событие в другой календарь
-// 
-// Параметры:
-//  Токен             - Строка - Токен                            - token
-//  КалендарьИсточник - Строка - ID календаря источника           - from
-//  КалендарьПриемник - Строка - ID календаря приемника           - to
-//  Событие           - Строка - ID события календаря источника   - event
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
-    
-    Заголовки   = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
-        + КалендарьИсточник 
-        + "/events/"
-        + Событие
-        + "/move?destination="
-        + КалендарьПриемник; 
-        
-    Ответ = OPI_Инструменты.Post(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Изменить событие
-// Изменяет существующее событие
-// 
-// Параметры:
-//  Токен           - Строка - Токен                    - token
-//  Календарь       - Строка - ID календаря             - calendar
-//  ОписаниеСобытия - Строка - Новое описание события   - props
-//  Событие         - Строка - ID события               - event
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт
-    Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие);
-КонецФункции
-
-// Удалить событие
-// Удаляет событие по ID
-// 
-// Параметры:
-//  Токен     - Строка - Токен         - token
-//  Календарь - Строка - ID календаря  - calendar
-//  Событие   - Строка - ID события    - event
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
-    
-    Заголовки   = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
-        + Календарь 
-        + "/events/"
-        + Событие; 
-        
-    Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПреобразоватьДату(Знач Дата)
-    
-    OPI_ПреобразованиеТипов.ПолучитьДату(Дата);
-    
-    СтруктураДаты = Новый Структура;
-    
-    Если Не ТипЗнч(Дата) = Тип("Дата") Тогда
-        Возврат Неопределено;
-    КонецЕсли;
-    
-    Если Дата = НачалоДня(Дата) Тогда
-        ФорматДаты = "ДФ=yyyy-MM-dd";
-        Поле       = "date";
-    Иначе
-        ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ";
-        Поле       = "dateTime";
-    КонецЕсли;
-    
-    Дата = Формат(Дата, ФорматДаты);
-    СтруктураДаты.Вставить(Поле      , Дата);
-    СтруктураДаты.Вставить("timeZone", "Europe/Moscow");
-    
-    Возврат СтруктураДаты;
-    
-КонецФункции
-
-Функция ПреобразоватьВложения(Знач Вложения)
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения);
-    
-    МассивВложений = Новый Массив;
-    
-    Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда
-        
-        Для Каждого Вложение Из Вложения Цикл
-            
-            ТекущеВложение = Новый Структура;
-            ТекущеВложение.Вставить("title"  , Вложение.Ключ);
-            ТекущеВложение.Вставить("fileUrl", Вложение.Значение);
-            
-            МассивВложений.Добавить(ТекущеВложение);
-            
-        КонецЦикла;
-        
-    КонецЕсли;
-    
-    Если МассивВложений.Количество() > 0 Тогда
-        Возврат МассивВложений;
-    Иначе
-        Возврат Неопределено;
-    КонецЕсли;
-
-КонецФункции
-
-Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "")
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия);
-    
-    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    Существующее = ЗначениеЗаполнено(Событие);
-    URL          = "https://www.googleapis.com/calendar/v3/calendars/" 
-        + Календарь 
-        + "/events"
-        + ?(Существующее, "/" + Событие, ""); 
-    
-    Дата0       = ОписаниеСобытия["ДатаНачала"];
-    Дата1       = ОписаниеСобытия["ДатаОкончания"];
-    Вложения    = ОписаниеСобытия["МассивURLФайловВложений"];
-    Вложения    = ПреобразоватьВложения(Вложения);
-    Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено
-        , Ложь
-        , ОписаниеСобытия["ОтправлятьУведомления"]);
-        
-    Параметры   = Новый Структура;
-    Параметры.Вставить("summary"    , ОписаниеСобытия["Заголовок"]);
-    Параметры.Вставить("description", ОписаниеСобытия["Описание"]);
-    Параметры.Вставить("location"   , ОписаниеСобытия["МестоПроведения"]);
-    Параметры.Вставить("start"      , ПреобразоватьДату(Дата0));
-    Параметры.Вставить("end"        , ПреобразоватьДату(Дата1));
-    Параметры.Вставить("attachments", Вложения);  
-    
-    ПараметрыURL = Новый Структура;    
-    ПараметрыURL.Вставить("sendUpdates"         , ?(Уведомления, "all", "none"));
-    ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false"));
-    
-    URL   = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
-    
-    OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);
-    
-    Если Существующее Тогда
-        Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
-    Иначе
-        Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина);
-    КонецЕсли;
-    
-    Возврат Ответ;
-
-КонецФункции
-
-Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") 
-    
-    Items     = "items";
-    NPT       = "nextPageToken";
-    Параметры = Новый Структура;
-    
-    Если ЗначениеЗаполнено(Страница) Тогда
-        Параметры.Вставить("pageToken", Страница);
-    КонецЕсли;
-    
-    Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList"
-        , Параметры
-        , Заголовки);
-        
-    Календари = Результат[Items];
-    Страница  = Результат[NPT];
-        
-    Для Каждого Календарь Из Календари Цикл
-        МассивКалендарей.Добавить(Календарь);    
-    КонецЦикла;    
-    
-    Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
-        ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница); 
-    КонецЕсли;
-          
-КонецПроцедуры
-
-Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") 
-    
-    Items     = "items";
-    NPT       = "nextPageToken";
-    Параметры = Новый Структура;
-    
-    Если ЗначениеЗаполнено(Страница) Тогда
-        Параметры.Вставить("pageToken", Страница);
-    КонецЕсли;
-    
-    Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events"
-        , Параметры
-        , Заголовки);
-        
-    События  = Результат[Items];
-    Страница = Результат[NPT];
-        
-    Для Каждого Событие Из События Цикл
-        МассивСобытий.Добавить(Событие);    
-    КонецЦикла;    
-    
-    Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
-        ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); 
-    КонецЕсли;
-          
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os
+// Библиотека: Google Calendar
+// Команда CLI: gcalendar
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСМетаданнымиКалендарей
+
+// Создать календарь
+// Создает пустой календарь
+// 
+// Параметры:
+//  Токен        - Строка - Токен                                - token
+//  Наименование - Строка - Наименование создаваемого календаря  - title
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars";
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("summary" , Наименование);
+    Параметры.Вставить("timeZone", "Europe/Moscow");
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить календарь
+// Получает информацию о календаре по ID
+// 
+// Параметры:
+//  Токен     - Строка - Токен        - token
+//  Календарь - Строка - ID календаря - calendar
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;    
+    Ответ     = OPI_Инструменты.Get(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Изменить календарь
+// Изменяет свойства существуещего календаря
+// 
+// Параметры:
+//  Токен        - Строка - Токен                      - token
+//  Календарь    - Строка - ID календаря               - calendar
+//  Наименование - Строка - Новое наименование         - title
+//  Описание     - Строка - Новое описание календаря   - description
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ИзменитьМетаданныеКалендаря(Знач Токен
+    , Знач Календарь
+    , Знач Наименование = ""
+    , Знач Описание = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
+    
+    Параметры = Новый Структура;
+    
+    Если ЗначениеЗаполнено(Наименование) Тогда
+        Параметры.Вставить("summary", Наименование);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Описание) Тогда
+        Параметры.Вставить("description", Описание);
+    КонецЕсли;
+      
+    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Очистить основной календарь
+// Очищает список событий основного календаря
+// 
+// Параметры:
+//  Токен - Строка - Токен - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars/primary/clear";    
+    Ответ     = OPI_Инструменты.Post(URL, , Заголовки, Ложь);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Удалить календарь
+// Удаляет календарь по ID
+// 
+// Параметры:
+//  Токен     - Строка - Токен         - token
+//  Календарь - Строка - ID календаря  - calendar
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;       
+    Ответ     = OPI_Инструменты.Delete(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСоСпискомКалендарей
+
+// Получить список календарей
+// Получает массив календарей аккаунта
+// 
+// Параметры:
+//  Токен - Строка - Токен - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Массив соответствий данных календарей
+Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Заголовки        = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    МассивКалендарей = Новый Массив;
+    
+    ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей);
+    
+    Возврат МассивКалендарей;
+    
+КонецФункции
+
+// Добавить календарь в список
+// Добавляет существующий календарь в список пользователя
+// 
+// Параметры:
+//  Токен     - Строка - Токен        - token
+//  Календарь - Строка - ID календаря - calendar
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList";
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("id", Календарь);
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить календарь списка
+// Получает календарь из списка пользователя по ID
+// 
+// Параметры:
+//  Токен     - Строка - Токен        - token
+//  Календарь - Строка - ID календаря - calendar
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
+    Ответ     = OPI_Инструменты.Get(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Удалить календарь из списка
+// Удаляет календарь из списка пользователя
+// 
+// Параметры:
+//  Токен     - Строка - Токен         - token
+//  Календарь - Строка - ID календаря  - calendar
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
+    Ответ     = OPI_Инструменты.Delete(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Изменить календарь списка
+// Изменяет свойства календаря из списка пользователей
+// 
+// Параметры:
+//  Токен              - Строка - Токен                                   - token
+//  Календарь          - Строка - ID календаря                            - calendar
+//  ОсновнойЦвет       - Строка - HEX основного цвета (#ffffff)           - primary
+//  ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff)     - secondary
+//  Скрытый            - Булево - Скрытый календарь                       - hidden
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ИзменитьКалендарьСписка(Знач Токен
+    , Знач Календарь
+    , Знач ОсновнойЦвет
+    , Знач ДополнительныйЦвет
+    , Знач Скрытый = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true";
+    
+    Параметры = Новый Соответствие;
+    Параметры.Вставить("hidden"         , Скрытый);
+    Параметры.Вставить("foregroundColor", ОсновнойЦвет);
+    Параметры.Вставить("backgroundColor", ДополнительныйЦвет);
+    
+    Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаССобытиями
+
+// Получить описание события !NOCLI
+// 
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Пустой макет события
+Функция ПолучитьОписаниеСобытия() Экспорт
+    
+    ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
+    Час         = 3600;
+    Событие     = Новый Соответствие;
+                       
+    Событие.Вставить("Описание"               , "");                          // Описание события
+    Событие.Вставить("Заголовок"              , "Новое событие");             // Заголовок события
+    Событие.Вставить("МестоПроведения"        , "");                          // Строка описание места проведения
+    Событие.Вставить("ДатаНачала"             , ТекущаяДата);                 // Дата начала события
+    Событие.Вставить("ДатаОкончания"          , ТекущаяДата + Час);           // Дата окончания события
+    Событие.Вставить("МассивURLФайловВложений", Новый Соответствие);          // Ключ - название, Значение - URL к файлу
+    Событие.Вставить("ОтправлятьУведомления"  , Истина);                      // Признак отправки уведомлений участникам
+
+    Возврат Событие;
+    
+КонецФункции
+
+// Получить список событий
+// Получает список всех событий календаря
+// 
+// Параметры:
+//  Токен     - Строка - Токен         - token
+//  Календарь - Строка - ID календаря  - calendar
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Массив соответствий событий
+Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    
+    Заголовки     = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    МассивСобытий = Новый Массив;
+    
+    ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий);
+    
+    Возврат МассивСобытий;
+    
+КонецФункции
+
+// Получить событие
+// Получает событие по ID
+// 
+// Параметры:
+//  Токен     - Строка - Токен        - token
+//  Календарь - Строка - ID календаря - calendar
+//  Событие   - Строка - ID события   - event
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
+    
+    Заголовки   = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
+        + Календарь 
+        + "/events/"
+        + Событие; 
+        
+    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Создать событие
+// Создает новое событие
+// 
+// Параметры:
+//  Токен           - Строка                        - Токен            - token         
+//  Календарь       - Строка                        - ID календаря     - calendar
+//  ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props
+// 
+// Возвращаемое значение:
+//  Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
+Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт    
+    Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия);
+КонецФункции
+
+// Переместить событие
+// Перемещает событие в другой календарь
+// 
+// Параметры:
+//  Токен             - Строка - Токен                            - token
+//  КалендарьИсточник - Строка - ID календаря источника           - from
+//  КалендарьПриемник - Строка - ID календаря приемника           - to
+//  Событие           - Строка - ID события календаря источника   - event
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
+    
+    Заголовки   = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
+        + КалендарьИсточник 
+        + "/events/"
+        + Событие
+        + "/move?destination="
+        + КалендарьПриемник; 
+        
+    Ответ = OPI_Инструменты.Post(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Изменить событие
+// Изменяет существующее событие
+// 
+// Параметры:
+//  Токен           - Строка - Токен                    - token
+//  Календарь       - Строка - ID календаря             - calendar
+//  ОписаниеСобытия - Строка - Новое описание события   - props
+//  Событие         - Строка - ID события               - event
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт
+    Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие);
+КонецФункции
+
+// Удалить событие
+// Удаляет событие по ID
+// 
+// Параметры:
+//  Токен     - Строка - Токен         - token
+//  Календарь - Строка - ID календаря  - calendar
+//  Событие   - Строка - ID события    - event
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
+    
+    Заголовки   = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL         = "https://www.googleapis.com/calendar/v3/calendars/" 
+        + Календарь 
+        + "/events/"
+        + Событие; 
+        
+    Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПреобразоватьДату(Знач Дата)
+    
+    OPI_ПреобразованиеТипов.ПолучитьДату(Дата);
+    
+    СтруктураДаты = Новый Структура;
+    
+    Если Не ТипЗнч(Дата) = Тип("Дата") Тогда
+        Возврат Неопределено;
+    КонецЕсли;
+    
+    Если Дата = НачалоДня(Дата) Тогда
+        ФорматДаты = "ДФ=yyyy-MM-dd";
+        Поле       = "date";
+    Иначе
+        ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ";
+        Поле       = "dateTime";
+    КонецЕсли;
+    
+    Дата = Формат(Дата, ФорматДаты);
+    СтруктураДаты.Вставить(Поле      , Дата);
+    СтруктураДаты.Вставить("timeZone", "Europe/Moscow");
+    
+    Возврат СтруктураДаты;
+    
+КонецФункции
+
+Функция ПреобразоватьВложения(Знач Вложения)
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения);
+    
+    МассивВложений = Новый Массив;
+    
+    Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда
+        
+        Для Каждого Вложение Из Вложения Цикл
+            
+            ТекущеВложение = Новый Структура;
+            ТекущеВложение.Вставить("title"  , Вложение.Ключ);
+            ТекущеВложение.Вставить("fileUrl", Вложение.Значение);
+            
+            МассивВложений.Добавить(ТекущеВложение);
+            
+        КонецЦикла;
+        
+    КонецЕсли;
+    
+    Если МассивВложений.Количество() > 0 Тогда
+        Возврат МассивВложений;
+    Иначе
+        Возврат Неопределено;
+    КонецЕсли;
+
+КонецФункции
+
+Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "")
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия);
+    
+    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    Существующее = ЗначениеЗаполнено(Событие);
+    URL          = "https://www.googleapis.com/calendar/v3/calendars/" 
+        + Календарь 
+        + "/events"
+        + ?(Существующее, "/" + Событие, ""); 
+    
+    Дата0       = ОписаниеСобытия["ДатаНачала"];
+    Дата1       = ОписаниеСобытия["ДатаОкончания"];
+    Вложения    = ОписаниеСобытия["МассивURLФайловВложений"];
+    Вложения    = ПреобразоватьВложения(Вложения);
+    Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено
+        , Ложь
+        , ОписаниеСобытия["ОтправлятьУведомления"]);
+        
+    Параметры   = Новый Структура;
+    Параметры.Вставить("summary"    , ОписаниеСобытия["Заголовок"]);
+    Параметры.Вставить("description", ОписаниеСобытия["Описание"]);
+    Параметры.Вставить("location"   , ОписаниеСобытия["МестоПроведения"]);
+    Параметры.Вставить("start"      , ПреобразоватьДату(Дата0));
+    Параметры.Вставить("end"        , ПреобразоватьДату(Дата1));
+    Параметры.Вставить("attachments", Вложения);  
+    
+    ПараметрыURL = Новый Структура;    
+    ПараметрыURL.Вставить("sendUpdates"         , ?(Уведомления, "all", "none"));
+    ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false"));
+    
+    URL   = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
+    
+    OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);
+    
+    Если Существующее Тогда
+        Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
+    Иначе
+        Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина);
+    КонецЕсли;
+    
+    Возврат Ответ;
+
+КонецФункции
+
+Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "") 
+    
+    Items     = "items";
+    NPT       = "nextPageToken";
+    Параметры = Новый Структура;
+    
+    Если ЗначениеЗаполнено(Страница) Тогда
+        Параметры.Вставить("pageToken", Страница);
+    КонецЕсли;
+    
+    Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList"
+        , Параметры
+        , Заголовки);
+        
+    Календари = Результат[Items];
+    Страница  = Результат[NPT];
+        
+    Для Каждого Календарь Из Календари Цикл
+        МассивКалендарей.Добавить(Календарь);    
+    КонецЦикла;    
+    
+    Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
+        ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница); 
+    КонецЕсли;
+          
+КонецПроцедуры
+
+Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "") 
+    
+    Items     = "items";
+    NPT       = "nextPageToken";
+    Параметры = Новый Структура;
+    
+    Если ЗначениеЗаполнено(Страница) Тогда
+        Параметры.Вставить("pageToken", Страница);
+    КонецЕсли;
+    
+    Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events"
+        , Параметры
+        , Заголовки);
+        
+    События  = Результат[Items];
+    Страница = Результат[NPT];
+        
+    Для Каждого Событие Из События Цикл
+        МассивСобытий.Добавить(Событие);    
+    КонецЦикла;    
+    
+    Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
+        ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница); 
+    КонецЕсли;
+          
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_GoogleDrive.os b/src/ru/OInt/core/Modules/OPI_GoogleDrive.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_GoogleDrive.os
rename to src/ru/OInt/core/Modules/OPI_GoogleDrive.os
index 57c5b0babf..d8a49c4833 100644
--- a/ru/OInt/core/Modules/OPI_GoogleDrive.os
+++ b/src/ru/OInt/core/Modules/OPI_GoogleDrive.os
@@ -1,719 +1,719 @@
-// Расположение OS: ./OInt/core/Modules/OPI_GoogleDrive.os
-// Библиотека: Google Drive
-// Команда CLI: gdrive
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСФайламиИКаталогами
-
-// Получить информацию об объекте
-// Получает информацию о папке или файле по ID
-// 
-// Параметры:
-//  Токен         - Строка - Токен                            - token
-//  Идентификатор - Строка - Идентификатор файла или каталога - object
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; 
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("fields", "*");
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить список каталогов
-// Получает список каталогов диска
-// 
-// Параметры:
-//  Токен       - Строка - Токен                                     - token
-//  ИмяСодержит - Строка - Отбор по имени                            - querry
-//  Подробно    - Булево - Добавляет список файлов к полям каталога  - depth
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Массив соответствий каталогов
-Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Подробно);
-    
-    Заголовки      = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    МассивОбъектов = Новый Массив;
-    Отбор          = Новый Массив;
-    
-    Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'");
-    
-    Если ЗначениеЗаполнено(ИмяСодержит) Тогда
-        Отбор.Добавить("name contains '" + ИмяСодержит + "'");
-    КонецЕсли;
-    
-    ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор);
-    
-    Если Подробно Тогда
-        РазложитьОбъектыПодробно(Токен, МассивОбъектов);    
-    КонецЕсли;
-    
-    Возврат МассивОбъектов;
-    
-КонецФункции
-
-// Получить список файлов
-// Получает список файлов
-// 
-// Параметры:
-//  Токен       - Строка - Токен                          - token
-//  ИмяСодержит - Строка - Отбор по имени                 - querry
-//  Каталог     - Строка - Отбор по ID каталога родителя  - catalog
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Массив соответствий файлов
-Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Каталог);
-    
-    Заголовки      = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    МассивОбъектов = Новый Массив;
-    Отбор          = Новый Массив;
-    
-    Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'");
-    
-    Если ЗначениеЗаполнено(ИмяСодержит) Тогда
-        Отбор.Добавить("name contains '" + ИмяСодержит + "'");
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Каталог) Тогда
-        Отбор.Добавить("'" + Каталог + "' in parents");
-    КонецЕсли;
-    
-    ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор);
-    
-    Возврат МассивОбъектов;
-
-КонецФункции
-
-// Загрузить файл
-// Загружает файл на диск
-// 
-// Параметры:
-//  Токен     - Строка                        - Токен                     - token
-//  Файл      - ДвоичныеДанные,Строка         - Загружаемый файл          - file
-//  Описание  - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт
-    Возврат УправлениеФайлом(Токен, Файл, Описание);   
-КонецФункции
-
-// Создать папку
-// Создает пустой каталог на диске
-// 
-// Параметры:
-//  Токен    - Строка - Токен      - token
-//  Имя      - Строка - Имя папки  - title
-//  Родитель - Строка - Родитель   - catalog
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СоздатьПапку(Знач Токен, Знач Имя, Знач Родитель = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
-    
-    Описание = Новый Соответствие;
-    Описание.Вставить("MIME"    , "application/vnd.google-apps.folder");
-    Описание.Вставить("Имя"     , Имя);
-    Описание.Вставить("Описание", "");
-    Описание.Вставить("Родитель", ?(ЗначениеЗаполнено(Родитель), Родитель, "root"));
-    
-    Возврат УправлениеФайлом(Токен, , Описание);
-    
-КонецФункции
-
-// Скачать файл
-// Получает файл по ID
-// 
-// Параметры:
-//  Токен          - Строка - Токен                 - token
-//  Идентификатор  - Строка - Идентификатор файла   - object
-//  ПутьСохранения - Строка - Путь сохранения файла - out 
-// 
-// Возвращаемое значение:
-//  ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения
-Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;  
-    
-    Параметры = Новый Соответствие;
-    Параметры.Вставить("alt", "media");
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Скоприровать объект
-// Копирует файл или каталог
-// 
-// Параметры:
-//  Токен         - Строка - Токен                     - token
-//  Идентификатор - Строка - Идентификатор объекта     - object
-//  НовоеИмя      - Строка - Новое имя объекта         - title
-//  НовыйРодитель - Строка - Новый каталог размещения  - catalog
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СкопироватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйРодитель);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy";    
-    
-    Параметры = Новый Структура;
-    
-    Если ЗначениеЗаполнено(НовоеИмя) Тогда
-        Параметры.Вставить("name", НовоеИмя);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(НовыйРодитель) Тогда
-        
-        МассивРодителей = Новый Массив;
-        МассивРодителей.Добавить(НовыйРодитель);
-        Параметры.Вставить("parents", МассивРодителей);
-        
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Обновить файл
-// Обновляет двоичные данные файла
-// 
-// Параметры:
-//  Токен         - Строка - Токен                                     - token
-//  Идентификатор - Строка - Идентификатор обновляемого объекта        - object
-//  Файл          - ДвоичныеДанные,Строка - Файл источник обновления   - file
-//  НовоеИмя      - Строка - Новое имя файла (если необходимо)         - title
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ОбновитьФайл(Знач Токен, Знач Идентификатор, Знач Файл, Знач НовоеИмя = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя);
-    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-    
-    Если ЗначениеЗаполнено(НовоеИмя) Тогда
-        Описание = Новый Соответствие;
-        Описание.Вставить("Имя", НовоеИмя);
-    Иначе
-        Описание = "";
-    КонецЕсли;
-    
-    Возврат УправлениеФайлом(Токен, Файл, Описание, Идентификатор);
-        
-КонецФункции
-
-// Удалить объект
-// Удаляет файл или каталог по ID
-// 
-// Параметры:
-//  Токен         - Строка - Токен                               - token
-//  Идентификатор - Строка - Идентификатор объекта для удаления  - object
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;    
-    Ответ     = OPI_Инструменты.Delete(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить описание файла !NOCLI
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Описание файла
-Функция ПолучитьОписаниеФайла() Экспорт
-    
-    Описание = Новый Соответствие;
-    Описание.Вставить("MIME"        , "image/jpeg");       // MIME-тип загружаемого файла
-    Описание.Вставить("Имя"         , "Новый файл.jpg");   // Имя файла с расширением
-    Описание.Вставить("Описание"    , "Это новый файл");   // Описание файла
-    Описание.Вставить("Родитель"    , "root");             // ID каталога загрузки или "root" для загрузки в корень
-    
-    Возврат Описание;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСКомментариями
-
-// Создать комментарий
-// Создает комментарий к файлу или каталогу
-// 
-// Параметры:
-//  Токен         - Строка - Токен                                                     - token
-//  Идентификатор - Строка - Идентификатор объекта, для которого необходим комментарий - object  
-//  Комментарий   - Строка - Текст комментария                                         - text
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СоздатьКомментарий(Знач Токен, Знач Идентификатор, Знач Комментарий) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/comments?fields=*"; 
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("content", Комментарий);
-    
-    Ответ = OPI_Инструменты.POST(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить комментарий
-// Получает комментарий по ID
-// 
-// Параметры:
-//  Токен         - Строка - Токен                                                   - token
-//  ИДОбъекта     - Строка - Идентификатор файла или каталога размещения комментария - object
-//  ИДКомментария - Строка - Идентификатор комментария                               - comment
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; 
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("fields", "*");
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить список комментариев
-// Получает список всех комментариев объекта
-// 
-// Параметры:
-//  Токен     - Строка - Токен                  - token
-//  ИДОбъекта - Строка - Идентификатор объекта  - object
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьСписокКомментариев(Знач Токен, Знач ИДОбъекта) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments"; 
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("fields", "*");
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Удалить комментарий
-// Удаляет комментарий по ID
-// 
-// Параметры:
-//  Токен         - Строка - Токен                                                    - token
-//  ИДОбъекта     - Строка - Идентификатор файла или каталога размещения комментария  - object
-//  ИДКомментария - Строка - Идентификатор комментария                                - comment
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; 
-    
-    Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "") 
-    
-    URL       = "https://www.googleapis.com/drive/v3/files";
-    Files     = "files";
-    NPT       = "nextPageToken";
-    Параметры = Новый Структура;
-    Параметры.Вставить("fields", "*");
-    
-    Если ЗначениеЗаполнено(Страница) Тогда
-        Параметры.Вставить("pageToken", Страница);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда     
-        ОтборСтрока = СтрСоединить(Отбор, " and ");
-        Параметры.Вставить("q", ОтборСтрока);       
-    КонецЕсли;
-    
-    Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-        
-    Объекты  = Результат[Files];
-    Страница = Результат[NPT];
-        
-    Для Каждого ТекущийОбъект Из Объекты Цикл
-         МассивОбъектов.Добавить(ТекущийОбъект);
-    КонецЦикла;    
-    
-    Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
-        ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница); 
-    КонецЕсли;
-          
-КонецПроцедуры
-
-Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов) 
-       
-    Для Каждого ТекущийОбъект Из МассивОбъектов Цикл
-        
-        МассивФайлов = Новый Массив;
-        ТекущийИД    = ТекущийОбъект["id"];
-        
-        Результат    = ПолучитьСписокФайлов(Токен, , ТекущийИД);
-        
-        Для Каждого Файл Из Результат Цикл
-            МассивФайлов.Добавить(Файл);    
-        КонецЦикла;
-        
-        ТекущийОбъект.Вставить("files", МассивФайлов);
-         
-    КонецЦикла;
-       
-КонецПроцедуры
-
-Процедура СформироватьПараметрыЗагрузкиФайла(Описание)
-    
-    СформированноеОписание = Новый Соответствие;
-    OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание);
-
-    СоответствиеПолей = Новый Соответствие;
-    СоответствиеПолей.Вставить("MIME"      , "mimeType");
-    СоответствиеПолей.Вставить("Имя"       , "name");
-    СоответствиеПолей.Вставить("Описание"  , "description");
-    СоответствиеПолей.Вставить("Родитель"  , "parents");
-    СоответствиеПолей.Вставить("Расширение", "fileExtension");
-    
-    Для Каждого Элемент Из Описание Цикл
-        
-        Если Элемент.Ключ = "Родитель" Тогда
-            
-            ТекущееЗначение = Новый Массив;
-            ТекущееЗначение.Добавить(Элемент.Значение);
-            
-        Иначе
-            
-            ТекущееЗначение = Элемент.Значение;
-            
-        КонецЕсли;
-        
-        ИмяПоля = СоответствиеПолей.Получить(Элемент.Ключ);
-        СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение);
-        
-    КонецЦикла;
-    
-    Описание = СформированноеОписание;
-    
-КонецПроцедуры
-
-Функция УправлениеФайлом(Знач Токен, Знач Файл = "", Знач Описание = "", Знач Идентификатор = "") 
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-    
-    Если ЗначениеЗаполнено(Описание) Тогда
-        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Описание);
-    КонецЕсли;
-    
-    MimeType = "mimeType";
-    
-    Если ЗначениеЗаполнено(Идентификатор) Тогда
-        MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType];
-    Иначе
-        MIME = Описание["MIME"];
-    КонецЕсли;    
-    
-    Если Не ЗначениеЗаполнено(Описание) Тогда
-        Описание = Новый Соответствие;
-    КонецЕсли;
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    СформироватьПараметрыЗагрузкиФайла(Описание);
-    ОписаниеJSON  = OPI_Инструменты.JSONСтрокой(Описание);
-    
-    СоответствиеФайла = Новый Соответствие;
-    
-    Если ЗначениеЗаполнено(Файл) Тогда
-        
-        РазмерЧасти = 268435457;      
-        Размер      = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти);
-   
-        СоответствиеФайла.Вставить(Файл, MIME);
-        
-        Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
-            Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
-        Иначе
-            Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор);
-        КонецЕсли;
-        
-    Иначе
-       Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); 
-    КонецЕсли;
-         
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ЗагрузитьМалыйФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "")
-    
-    URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
-    
-    Если ЗначениеЗаполнено(Идентификатор) Тогда
-        URL   = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
-        Ответ = OPI_Инструменты.PatchMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
-    Иначе
-        Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
-    КонецЕсли;
-
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ЗагрузитьБольшойФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "")
-    
-    Для Каждого Файл Из СоответствиеФайла Цикл
-        Двоичные = Файл.Ключ;
-        Прервать;
-    КонецЦикла;
-    
-    URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
-    
-    Если ЗначениеЗаполнено(Идентификатор) Тогда
-        URL   = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
-        Ответ = OPI_Инструменты.Patch(URL, Описание, Заголовки, Истина, Истина);
-    Иначе
-        Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина);
-    КонецЕсли;
-         
-    АдресЗагрузки = Ответ.Заголовки["Location"];
-    
-    Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда
-        OPI_Инструменты.ОбработатьОтвет(Ответ);
-        Возврат Ответ;
-    КонецЕсли;
-       
-	ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки);
-	Ответ         = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ);
-    
-    OPI_Инструменты.ОбработатьОтвет(Ответ);
-    Возврат Ответ;
-   
-КонецФункции
-
-Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки)
-	
-	Ответ            = "";
-	РазмерЧасти      = 268435456;
-	ПрочитаноБайт    = 0;
-    ТекущаяПозиция   = 0;
-    ОбщийРазмер      = Двоичные.Размер();
-    СтрОбщийРазмер   = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер);
-    ЧтениеДанных     = Новый ЧтениеДанных(Двоичные);
-    ИсходныйПоток    = ЧтениеДанных.ИсходныйПоток();
-    
-    Пока ПрочитаноБайт < ОбщийРазмер Цикл
-            
-        ПрочитаноБайт    = ИсходныйПоток.ТекущаяПозиция();
-        Результат        = ЧтениеДанных.Прочитать(РазмерЧасти);
-        ТекущиеДанные    = Результат.ПолучитьДвоичныеДанные();
-        РазмерТекущих    = ТекущиеДанные.Размер();
-        СледующаяПозиция = ТекущаяПозиция + РазмерТекущих - 1; 
-        
-        Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
-            Прервать;
-        КонецЕсли;
-        
-        ЗаголовокПотока = "bytes "
-            + OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция)
-            + "-" 
-            + OPI_Инструменты.ЧислоВСтроку(СледующаяПозиция) 
-            + "/" 
-            + СтрОбщийРазмер;
-            
-        ДопЗаголовки     = Новый Соответствие;
-        ДопЗаголовки.Вставить("Content-Length", OPI_Инструменты.ЧислоВСтроку(РазмерТекущих));
-        ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); 
-        ДопЗаголовки.Вставить("Content-Type"  , "application/octet-stream");
-        
-        Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
-        
-		РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
-		
-		Если ЗначениеЗаполнено(РезультатПроверки) Тогда
-			Возврат РезультатПроверки;
-		КонецЕсли;
-        
-        КБайт = 1024;
-        МБайт = КБайт * КБайт;
-		Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
-        
-        ВыполнитьСборкуМусора();
-        ОсвободитьОбъект(ТекущиеДанные);
-        
-    КонецЦикла;
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
-	
-    НачалоКодовОшибок = 400;
-    КонецКодовПадений = 600;
-    НачалоКодовУспеха = 200;
-    КонецКодовУспеха  = 300;
-    Перенаправление   = 308;
-    
-    Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
-         
-        ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
-        ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
-        
-        ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
-        
-        Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
-        	
-            OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
-            Возврат ОтветПроверки;
-            
-        ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
-        	
-            ЗагруженныеДанные = Ответ.Заголовки["Range"];
-            
-        Иначе
-        	
-            OPI_Инструменты.ОбработатьОтвет(Ответ);
-        	Возврат Ответ;
-        	
-        КонецЕсли;
-        
-    Иначе
-        ЗагруженныеДанные = Ответ.Заголовки["Range"];
-    КонецЕсли;
-        
-    Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
-        OPI_Инструменты.ОбработатьОтвет(Ответ);
-        Возврат Ответ;
-    КонецЕсли;
-    
-    ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
-    МассивИнформации  = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
-    НеобходимоЧастей  = 2;
-    
-    Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
-    	OPI_Инструменты.ОбработатьОтвет(Ответ);
-        Возврат Ответ;
-    КонецЕсли;
-    
-    ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
-    
-    Возврат "";
-        
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_GoogleDrive.os
+// Библиотека: Google Drive
+// Команда CLI: gdrive
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСФайламиИКаталогами
+
+// Получить информацию об объекте
+// Получает информацию о папке или файле по ID
+// 
+// Параметры:
+//  Токен         - Строка - Токен                            - token
+//  Идентификатор - Строка - Идентификатор файла или каталога - object
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор; 
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("fields", "*");
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить список каталогов
+// Получает список каталогов диска
+// 
+// Параметры:
+//  Токен       - Строка - Токен                                     - token
+//  ИмяСодержит - Строка - Отбор по имени                            - querry
+//  Подробно    - Булево - Добавляет список файлов к полям каталога  - depth
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Массив соответствий каталогов
+Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Подробно);
+    
+    Заголовки      = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    МассивОбъектов = Новый Массив;
+    Отбор          = Новый Массив;
+    
+    Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'");
+    
+    Если ЗначениеЗаполнено(ИмяСодержит) Тогда
+        Отбор.Добавить("name contains '" + ИмяСодержит + "'");
+    КонецЕсли;
+    
+    ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор);
+    
+    Если Подробно Тогда
+        РазложитьОбъектыПодробно(Токен, МассивОбъектов);    
+    КонецЕсли;
+    
+    Возврат МассивОбъектов;
+    
+КонецФункции
+
+// Получить список файлов
+// Получает список файлов
+// 
+// Параметры:
+//  Токен       - Строка - Токен                          - token
+//  ИмяСодержит - Строка - Отбор по имени                 - querry
+//  Каталог     - Строка - Отбор по ID каталога родителя  - catalog
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Массив соответствий файлов
+Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Каталог);
+    
+    Заголовки      = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    МассивОбъектов = Новый Массив;
+    Отбор          = Новый Массив;
+    
+    Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'");
+    
+    Если ЗначениеЗаполнено(ИмяСодержит) Тогда
+        Отбор.Добавить("name contains '" + ИмяСодержит + "'");
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Каталог) Тогда
+        Отбор.Добавить("'" + Каталог + "' in parents");
+    КонецЕсли;
+    
+    ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор);
+    
+    Возврат МассивОбъектов;
+
+КонецФункции
+
+// Загрузить файл
+// Загружает файл на диск
+// 
+// Параметры:
+//  Токен     - Строка                        - Токен                     - token
+//  Файл      - ДвоичныеДанные,Строка         - Загружаемый файл          - file
+//  Описание  - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт
+    Возврат УправлениеФайлом(Токен, Файл, Описание);   
+КонецФункции
+
+// Создать папку
+// Создает пустой каталог на диске
+// 
+// Параметры:
+//  Токен    - Строка - Токен      - token
+//  Имя      - Строка - Имя папки  - title
+//  Родитель - Строка - Родитель   - catalog
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СоздатьПапку(Знач Токен, Знач Имя, Знач Родитель = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+    
+    Описание = Новый Соответствие;
+    Описание.Вставить("MIME"    , "application/vnd.google-apps.folder");
+    Описание.Вставить("Имя"     , Имя);
+    Описание.Вставить("Описание", "");
+    Описание.Вставить("Родитель", ?(ЗначениеЗаполнено(Родитель), Родитель, "root"));
+    
+    Возврат УправлениеФайлом(Токен, , Описание);
+    
+КонецФункции
+
+// Скачать файл
+// Получает файл по ID
+// 
+// Параметры:
+//  Токен          - Строка - Токен                 - token
+//  Идентификатор  - Строка - Идентификатор файла   - object
+//  ПутьСохранения - Строка - Путь сохранения файла - out 
+// 
+// Возвращаемое значение:
+//  ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения
+Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;  
+    
+    Параметры = Новый Соответствие;
+    Параметры.Вставить("alt", "media");
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Скоприровать объект
+// Копирует файл или каталог
+// 
+// Параметры:
+//  Токен         - Строка - Токен                     - token
+//  Идентификатор - Строка - Идентификатор объекта     - object
+//  НовоеИмя      - Строка - Новое имя объекта         - title
+//  НовыйРодитель - Строка - Новый каталог размещения  - catalog
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СкопироватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйРодитель);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy";    
+    
+    Параметры = Новый Структура;
+    
+    Если ЗначениеЗаполнено(НовоеИмя) Тогда
+        Параметры.Вставить("name", НовоеИмя);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(НовыйРодитель) Тогда
+        
+        МассивРодителей = Новый Массив;
+        МассивРодителей.Добавить(НовыйРодитель);
+        Параметры.Вставить("parents", МассивРодителей);
+        
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Обновить файл
+// Обновляет двоичные данные файла
+// 
+// Параметры:
+//  Токен         - Строка - Токен                                     - token
+//  Идентификатор - Строка - Идентификатор обновляемого объекта        - object
+//  Файл          - ДвоичныеДанные,Строка - Файл источник обновления   - file
+//  НовоеИмя      - Строка - Новое имя файла (если необходимо)         - title
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ОбновитьФайл(Знач Токен, Знач Идентификатор, Знач Файл, Знач НовоеИмя = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя);
+    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+    
+    Если ЗначениеЗаполнено(НовоеИмя) Тогда
+        Описание = Новый Соответствие;
+        Описание.Вставить("Имя", НовоеИмя);
+    Иначе
+        Описание = "";
+    КонецЕсли;
+    
+    Возврат УправлениеФайлом(Токен, Файл, Описание, Идентификатор);
+        
+КонецФункции
+
+// Удалить объект
+// Удаляет файл или каталог по ID
+// 
+// Параметры:
+//  Токен         - Строка - Токен                               - token
+//  Идентификатор - Строка - Идентификатор объекта для удаления  - object
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;    
+    Ответ     = OPI_Инструменты.Delete(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить описание файла !NOCLI
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Описание файла
+Функция ПолучитьОписаниеФайла() Экспорт
+    
+    Описание = Новый Соответствие;
+    Описание.Вставить("MIME"        , "image/jpeg");       // MIME-тип загружаемого файла
+    Описание.Вставить("Имя"         , "Новый файл.jpg");   // Имя файла с расширением
+    Описание.Вставить("Описание"    , "Это новый файл");   // Описание файла
+    Описание.Вставить("Родитель"    , "root");             // ID каталога загрузки или "root" для загрузки в корень
+    
+    Возврат Описание;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСКомментариями
+
+// Создать комментарий
+// Создает комментарий к файлу или каталогу
+// 
+// Параметры:
+//  Токен         - Строка - Токен                                                     - token
+//  Идентификатор - Строка - Идентификатор объекта, для которого необходим комментарий - object  
+//  Комментарий   - Строка - Текст комментария                                         - text
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СоздатьКомментарий(Знач Токен, Знач Идентификатор, Знач Комментарий) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/comments?fields=*"; 
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("content", Комментарий);
+    
+    Ответ = OPI_Инструменты.POST(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить комментарий
+// Получает комментарий по ID
+// 
+// Параметры:
+//  Токен         - Строка - Токен                                                   - token
+//  ИДОбъекта     - Строка - Идентификатор файла или каталога размещения комментария - object
+//  ИДКомментария - Строка - Идентификатор комментария                               - comment
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; 
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("fields", "*");
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить список комментариев
+// Получает список всех комментариев объекта
+// 
+// Параметры:
+//  Токен     - Строка - Токен                  - token
+//  ИДОбъекта - Строка - Идентификатор объекта  - object
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьСписокКомментариев(Знач Токен, Знач ИДОбъекта) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments"; 
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("fields", "*");
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Удалить комментарий
+// Удаляет комментарий по ID
+// 
+// Параметры:
+//  Токен         - Строка - Токен                                                    - token
+//  ИДОбъекта     - Строка - Идентификатор файла или каталога размещения комментария  - object
+//  ИДКомментария - Строка - Идентификатор комментария                                - comment
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария; 
+    
+    Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "") 
+    
+    URL       = "https://www.googleapis.com/drive/v3/files";
+    Files     = "files";
+    NPT       = "nextPageToken";
+    Параметры = Новый Структура;
+    Параметры.Вставить("fields", "*");
+    
+    Если ЗначениеЗаполнено(Страница) Тогда
+        Параметры.Вставить("pageToken", Страница);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда     
+        ОтборСтрока = СтрСоединить(Отбор, " and ");
+        Параметры.Вставить("q", ОтборСтрока);       
+    КонецЕсли;
+    
+    Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+        
+    Объекты  = Результат[Files];
+    Страница = Результат[NPT];
+        
+    Для Каждого ТекущийОбъект Из Объекты Цикл
+         МассивОбъектов.Добавить(ТекущийОбъект);
+    КонецЦикла;    
+    
+    Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
+        ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница); 
+    КонецЕсли;
+          
+КонецПроцедуры
+
+Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов) 
+       
+    Для Каждого ТекущийОбъект Из МассивОбъектов Цикл
+        
+        МассивФайлов = Новый Массив;
+        ТекущийИД    = ТекущийОбъект["id"];
+        
+        Результат    = ПолучитьСписокФайлов(Токен, , ТекущийИД);
+        
+        Для Каждого Файл Из Результат Цикл
+            МассивФайлов.Добавить(Файл);    
+        КонецЦикла;
+        
+        ТекущийОбъект.Вставить("files", МассивФайлов);
+         
+    КонецЦикла;
+       
+КонецПроцедуры
+
+Процедура СформироватьПараметрыЗагрузкиФайла(Описание)
+    
+    СформированноеОписание = Новый Соответствие;
+    OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание);
+
+    СоответствиеПолей = Новый Соответствие;
+    СоответствиеПолей.Вставить("MIME"      , "mimeType");
+    СоответствиеПолей.Вставить("Имя"       , "name");
+    СоответствиеПолей.Вставить("Описание"  , "description");
+    СоответствиеПолей.Вставить("Родитель"  , "parents");
+    СоответствиеПолей.Вставить("Расширение", "fileExtension");
+    
+    Для Каждого Элемент Из Описание Цикл
+        
+        Если Элемент.Ключ = "Родитель" Тогда
+            
+            ТекущееЗначение = Новый Массив;
+            ТекущееЗначение.Добавить(Элемент.Значение);
+            
+        Иначе
+            
+            ТекущееЗначение = Элемент.Значение;
+            
+        КонецЕсли;
+        
+        ИмяПоля = СоответствиеПолей.Получить(Элемент.Ключ);
+        СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение);
+        
+    КонецЦикла;
+    
+    Описание = СформированноеОписание;
+    
+КонецПроцедуры
+
+Функция УправлениеФайлом(Знач Токен, Знач Файл = "", Знач Описание = "", Знач Идентификатор = "") 
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+    
+    Если ЗначениеЗаполнено(Описание) Тогда
+        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Описание);
+    КонецЕсли;
+    
+    MimeType = "mimeType";
+    
+    Если ЗначениеЗаполнено(Идентификатор) Тогда
+        MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType];
+    Иначе
+        MIME = Описание["MIME"];
+    КонецЕсли;    
+    
+    Если Не ЗначениеЗаполнено(Описание) Тогда
+        Описание = Новый Соответствие;
+    КонецЕсли;
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    СформироватьПараметрыЗагрузкиФайла(Описание);
+    ОписаниеJSON  = OPI_Инструменты.JSONСтрокой(Описание);
+    
+    СоответствиеФайла = Новый Соответствие;
+    
+    Если ЗначениеЗаполнено(Файл) Тогда
+        
+        РазмерЧасти = 268435457;      
+        Размер      = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти);
+   
+        СоответствиеФайла.Вставить(Файл, MIME);
+        
+        Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
+            Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
+        Иначе
+            Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор);
+        КонецЕсли;
+        
+    Иначе
+       Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); 
+    КонецЕсли;
+         
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ЗагрузитьМалыйФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "")
+    
+    URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
+    
+    Если ЗначениеЗаполнено(Идентификатор) Тогда
+        URL   = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
+        Ответ = OPI_Инструменты.PatchMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
+    Иначе
+        Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
+    КонецЕсли;
+
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ЗагрузитьБольшойФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "")
+    
+    Для Каждого Файл Из СоответствиеФайла Цикл
+        Двоичные = Файл.Ключ;
+        Прервать;
+    КонецЦикла;
+    
+    URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
+    
+    Если ЗначениеЗаполнено(Идентификатор) Тогда
+        URL   = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
+        Ответ = OPI_Инструменты.Patch(URL, Описание, Заголовки, Истина, Истина);
+    Иначе
+        Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина);
+    КонецЕсли;
+         
+    АдресЗагрузки = Ответ.Заголовки["Location"];
+    
+    Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда
+        OPI_Инструменты.ОбработатьОтвет(Ответ);
+        Возврат Ответ;
+    КонецЕсли;
+       
+	ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки);
+	Ответ         = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ);
+    
+    OPI_Инструменты.ОбработатьОтвет(Ответ);
+    Возврат Ответ;
+   
+КонецФункции
+
+Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки)
+	
+	Ответ            = "";
+	РазмерЧасти      = 268435456;
+	ПрочитаноБайт    = 0;
+    ТекущаяПозиция   = 0;
+    ОбщийРазмер      = Двоичные.Размер();
+    СтрОбщийРазмер   = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер);
+    ЧтениеДанных     = Новый ЧтениеДанных(Двоичные);
+    ИсходныйПоток    = ЧтениеДанных.ИсходныйПоток();
+    
+    Пока ПрочитаноБайт < ОбщийРазмер Цикл
+            
+        ПрочитаноБайт    = ИсходныйПоток.ТекущаяПозиция();
+        Результат        = ЧтениеДанных.Прочитать(РазмерЧасти);
+        ТекущиеДанные    = Результат.ПолучитьДвоичныеДанные();
+        РазмерТекущих    = ТекущиеДанные.Размер();
+        СледующаяПозиция = ТекущаяПозиция + РазмерТекущих - 1; 
+        
+        Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
+            Прервать;
+        КонецЕсли;
+        
+        ЗаголовокПотока = "bytes "
+            + OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция)
+            + "-" 
+            + OPI_Инструменты.ЧислоВСтроку(СледующаяПозиция) 
+            + "/" 
+            + СтрОбщийРазмер;
+            
+        ДопЗаголовки     = Новый Соответствие;
+        ДопЗаголовки.Вставить("Content-Length", OPI_Инструменты.ЧислоВСтроку(РазмерТекущих));
+        ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока); 
+        ДопЗаголовки.Вставить("Content-Type"  , "application/octet-stream");
+        
+        Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
+        
+		РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
+		
+		Если ЗначениеЗаполнено(РезультатПроверки) Тогда
+			Возврат РезультатПроверки;
+		КонецЕсли;
+        
+        КБайт = 1024;
+        МБайт = КБайт * КБайт;
+		Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
+        
+        ВыполнитьСборкуМусора();
+        ОсвободитьОбъект(ТекущиеДанные);
+        
+    КонецЦикла;
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
+	
+    НачалоКодовОшибок = 400;
+    КонецКодовПадений = 600;
+    НачалоКодовУспеха = 200;
+    КонецКодовУспеха  = 300;
+    Перенаправление   = 308;
+    
+    Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
+         
+        ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
+        ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
+        
+        ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
+        
+        Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
+        	
+            OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
+            Возврат ОтветПроверки;
+            
+        ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
+        	
+            ЗагруженныеДанные = Ответ.Заголовки["Range"];
+            
+        Иначе
+        	
+            OPI_Инструменты.ОбработатьОтвет(Ответ);
+        	Возврат Ответ;
+        	
+        КонецЕсли;
+        
+    Иначе
+        ЗагруженныеДанные = Ответ.Заголовки["Range"];
+    КонецЕсли;
+        
+    Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
+        OPI_Инструменты.ОбработатьОтвет(Ответ);
+        Возврат Ответ;
+    КонецЕсли;
+    
+    ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
+    МассивИнформации  = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
+    НеобходимоЧастей  = 2;
+    
+    Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
+    	OPI_Инструменты.ОбработатьОтвет(Ответ);
+        Возврат Ответ;
+    КонецЕсли;
+    
+    ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
+    
+    Возврат "";
+        
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_GoogleSheets.os b/src/ru/OInt/core/Modules/OPI_GoogleSheets.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_GoogleSheets.os
rename to src/ru/OInt/core/Modules/OPI_GoogleSheets.os
index 1828f40471..f8db5f80e2 100644
--- a/ru/OInt/core/Modules/OPI_GoogleSheets.os
+++ b/src/ru/OInt/core/Modules/OPI_GoogleSheets.os
@@ -1,409 +1,409 @@
-// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os
-// Библиотека: Google Sheets
-// Команда CLI: gsheets
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСКнигами
-
-// Создать книгу
-// Создает новую книгу
-// 
-// Параметры:
-//  Токен            - Строка           - Токен                                           - token
-//  Наименование     - Строка           - Наименование                                    - title
-//  МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов);
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://sheets.googleapis.com/v4/spreadsheets";
-   
-    Свойства  = Новый Структура("title" , Наименование);
-    Листы     = Новый Массив;
-    
-    ЗаполнитьМассивЛистов(МассивИменЛистов, Листы);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры);
-    OPI_Инструменты.ДобавитьПоле("sheets"    , Листы   , "Коллекция", Параметры);
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить книгу
-// Получает информацию о книге по ID
-// 
-// Параметры:
-//  Токен         - Строка - Токен               - token
-//  Идентификатор - Строка - Идентификатор книги - spreadsheet
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); 
-    
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор;
-    
-    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Изменить наименование книги
-// Изменяет наименование существующей книги
-// 
-// Параметры:
-//  Токен        - Строка - Токен              - token
-//  Книга        - Строка - ID книги           - spreadsheet
-//  Наименование - Строка - Новое наименование - title
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    
-    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
-    
-    Изменение       = Новый Структура("title", Наименование);
-    ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title");
-    Запрос          = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения);
-    
-    МассивЗапросов  = Новый Массив;
-    МассивЗапросов.Добавить(Запрос);
-    
-    Параметры = Новый Структура("requests", МассивЗапросов);
-        
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСЛистами
-
-// Добавить лист
-// Добавляет новый лист в книгу
-// 
-// 
-// Параметры:
-//  Токен        - Строка - Токен                     - token
-//  Книга        - Строка - Идентификатор книги       - spreadsheet
-//  Наименование - Строка - Наименование нового листа - title
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
-        
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
-    Лист      = СоздатьЛист(Наименование);
-    
-    Запросы   = Новый Массив;
-    Изменение = Новый Структура("addSheet", Лист);
-    Запросы.Добавить(Изменение);
-    
-    Параметры = Новый Структура("requests", Запросы);
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Удалить лист
-// Удаляет лист из книги
-// 
-// Параметры:
-//  Токен   - Строка - Токен                          - token
-//  Книга   - Строка - Идентификатор книги            - spreadsheet
-//  Лист    - Строка - Идентификатор удаляемого листа - sheet
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
-        
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
-    
-    Запросы   = Новый Массив;
-    Лист      = Новый Структура("sheetId"    , Лист);
-    Изменение = Новый Структура("deleteSheet", Лист);
-    Запросы.Добавить(Изменение);
-    
-    Параметры = Новый Структура("requests", Запросы);
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Копировать лист
-// Копирует лист из одной книги в другую
-// 
-// Параметры:
-//  Токен  - Строка - Токен - token
-//  Откуда - Строка - ID книги источника   - from
-//  Куда   - Строка - ID книги приемника   - to
-//  Лист   - Строка - ID копируемого листа - sheet
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
-        
-    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL       = "https://sheets.googleapis.com/v4/spreadsheets/"
-        + Откуда
-        + "/sheets/"
-        + Лист
-        + ":copyTo";
-    
-    Параметры = Новый Структура("destinationSpreadsheetId", Куда);  
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-   
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСДанными
-
-// Установить значения ячеек
-// Устанавливает значения ячеек листа
-// 
-// Параметры:
-//  Токен                - Строка                        - Токен    - token
-//  Книга                - Строка                        - ID книги - spreadsheet 
-//  СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1   - data
-//  Лист                 - Строка                        - Имя листа (первый лист по умолчанию) - sheetname
-//  ОсновноеИзмерение    - Строка                        - Основное измерение при заполнении диапазона массивом - dim
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УстановитьЗначенияЯчеек(Знач Токен
-    , Знач Книга
-    , Знач СоответствиеЗначений
-    , Знач Лист = ""
-    , Знач ОсновноеИзмерение = "COLUMNS") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений);
-    
-    Если Не ТипЗнч(СоответствиеЗначений) = Тип("Структура")
-        И Не ТипЗнч(СоответствиеЗначений) = Тип("Соответствие") Тогда
-        Возврат "Не удалось привести структуру значений к коллекции";
-    КонецЕсли;
-    
-    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate";
-    МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист);
-
-    Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED");
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Очистить ячейки
-// Очищает значение в ячейках
-// 
-// Параметры:
-//  Токен       - Строка           - Токен                                - token
-//  Книга       - Строка           - ID книги                             - spreadsheet
-//  МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки     - cells
-//  Лист        - Строка           - Имя листа (первый лист по умолчанию) - sheetname
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
-    
-    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear";
-    
-    СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
-        
-    Параметры = Новый Структура("ranges", МассивЯчеек);
-    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить значения ячеек
-// Получает значения ячеек таблицы
-// 
-// Параметры:
-//  Токен       - Строка           - Токен                                                              - token
-//  Книга       - Строка           - ID книги                                                           - spreadsheet
-//  МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено)  - cells
-//  Лист        - Строка           - Имя листа (первый лист по умолчанию)                               - sheetname
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
-      
-    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
-    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet";
-  
-    Если ЗначениеЗаполнено(МассивЯчеек) Тогда
-        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);  
-        СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
-        
-        Первый = Истина;
-        Для Каждого Ячейка Из МассивЯчеек Цикл
-            Разделитель = ?(Первый, "?", "&");
-            URL         = URL + Разделитель + "ranges=" + Ячейка;
-            Первый      = Ложь;
-        КонецЦикла;
-    Иначе
-        URL = URL + "?ranges='" + Лист + "'";
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов)
-    
-    Для Каждого ИмяЛиста Из МассивИмен Цикл
-        
-        Лист = СоздатьЛист(ИмяЛиста);
-        МассивЛистов.Добавить(Лист);
-        
-    КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист)
-    
-    Если ЗначениеЗаполнено(Лист) Тогда
-		Ячейка     = "'" + Лист + "'!" + Ячейка;
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Функция СоздатьЛист(Знач Наименование)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    
-    СвойстваЛиста = Новый Структура("title"     , Наименование);
-    Лист          = Новый Структура("properties", СвойстваЛиста);
-
-    Возврат Лист;
-    
-КонецФункции
-
-Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
-    
-    МассивДанных = Новый Массив;
-    
-    Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл
-        
-        ТекущееЗначение = ДанныеЯчейки.Значение;
-        ТекущийКлюч     = ДанныеЯчейки.Ключ;
-        
-        ДобавитьИмяЛиста(ТекущийКлюч, Лист);
-        
-        OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение);
-        
-        ТекущиеДанные   = Новый Соответствие;
-        ТекущийМассив   = Новый Массив;
-        
-        ТекущийМассив.Добавить(ТекущееЗначение);
-        
-        OPI_Инструменты.ДобавитьПоле("range"         , ТекущийКлюч      , "Строка", ТекущиеДанные);
-        OPI_Инструменты.ДобавитьПоле("values"        , ТекущийМассив    , "Массив", ТекущиеДанные);
-        OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные);
-        
-        МассивДанных.Добавить(ТекущиеДанные);
-        
-    КонецЦикла;
-    
-    Возврат МассивДанных;
-    
-КонецФункции
-
-Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист)
-
-   OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); 
-   
-   Для Н = 0 По МассивИмен.ВГраница() Цикл       
-       ДобавитьИмяЛиста(МассивИмен[Н], Лист);
-   КонецЦикла;
-       
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os
+// Библиотека: Google Sheets
+// Команда CLI: gsheets
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСКнигами
+
+// Создать книгу
+// Создает новую книгу
+// 
+// Параметры:
+//  Токен            - Строка           - Токен                                           - token
+//  Наименование     - Строка           - Наименование                                    - title
+//  МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов);
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets";
+   
+    Свойства  = Новый Структура("title" , Наименование);
+    Листы     = Новый Массив;
+    
+    ЗаполнитьМассивЛистов(МассивИменЛистов, Листы);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры);
+    OPI_Инструменты.ДобавитьПоле("sheets"    , Листы   , "Коллекция", Параметры);
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить книгу
+// Получает информацию о книге по ID
+// 
+// Параметры:
+//  Токен         - Строка - Токен               - token
+//  Идентификатор - Строка - Идентификатор книги - spreadsheet
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); 
+    
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор;
+    
+    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Изменить наименование книги
+// Изменяет наименование существующей книги
+// 
+// Параметры:
+//  Токен        - Строка - Токен              - token
+//  Книга        - Строка - ID книги           - spreadsheet
+//  Наименование - Строка - Новое наименование - title
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    
+    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
+    
+    Изменение       = Новый Структура("title", Наименование);
+    ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title");
+    Запрос          = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения);
+    
+    МассивЗапросов  = Новый Массив;
+    МассивЗапросов.Добавить(Запрос);
+    
+    Параметры = Новый Структура("requests", МассивЗапросов);
+        
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСЛистами
+
+// Добавить лист
+// Добавляет новый лист в книгу
+// 
+// 
+// Параметры:
+//  Токен        - Строка - Токен                     - token
+//  Книга        - Строка - Идентификатор книги       - spreadsheet
+//  Наименование - Строка - Наименование нового листа - title
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+        
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
+    Лист      = СоздатьЛист(Наименование);
+    
+    Запросы   = Новый Массив;
+    Изменение = Новый Структура("addSheet", Лист);
+    Запросы.Добавить(Изменение);
+    
+    Параметры = Новый Структура("requests", Запросы);
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Удалить лист
+// Удаляет лист из книги
+// 
+// Параметры:
+//  Токен   - Строка - Токен                          - token
+//  Книга   - Строка - Идентификатор книги            - spreadsheet
+//  Лист    - Строка - Идентификатор удаляемого листа - sheet
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
+        
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
+    
+    Запросы   = Новый Массив;
+    Лист      = Новый Структура("sheetId"    , Лист);
+    Изменение = Новый Структура("deleteSheet", Лист);
+    Запросы.Добавить(Изменение);
+    
+    Параметры = Новый Структура("requests", Запросы);
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Копировать лист
+// Копирует лист из одной книги в другую
+// 
+// Параметры:
+//  Токен  - Строка - Токен - token
+//  Откуда - Строка - ID книги источника   - from
+//  Куда   - Строка - ID книги приемника   - to
+//  Лист   - Строка - ID копируемого листа - sheet
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
+        
+    Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL       = "https://sheets.googleapis.com/v4/spreadsheets/"
+        + Откуда
+        + "/sheets/"
+        + Лист
+        + ":copyTo";
+    
+    Параметры = Новый Структура("destinationSpreadsheetId", Куда);  
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+   
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСДанными
+
+// Установить значения ячеек
+// Устанавливает значения ячеек листа
+// 
+// Параметры:
+//  Токен                - Строка                        - Токен    - token
+//  Книга                - Строка                        - ID книги - spreadsheet 
+//  СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1   - data
+//  Лист                 - Строка                        - Имя листа (первый лист по умолчанию) - sheetname
+//  ОсновноеИзмерение    - Строка                        - Основное измерение при заполнении диапазона массивом - dim
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УстановитьЗначенияЯчеек(Знач Токен
+    , Знач Книга
+    , Знач СоответствиеЗначений
+    , Знач Лист = ""
+    , Знач ОсновноеИзмерение = "COLUMNS") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений);
+    
+    Если Не ТипЗнч(СоответствиеЗначений) = Тип("Структура")
+        И Не ТипЗнч(СоответствиеЗначений) = Тип("Соответствие") Тогда
+        Возврат "Не удалось привести структуру значений к коллекции";
+    КонецЕсли;
+    
+    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate";
+    МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист);
+
+    Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED");
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Очистить ячейки
+// Очищает значение в ячейках
+// 
+// Параметры:
+//  Токен       - Строка           - Токен                                - token
+//  Книга       - Строка           - ID книги                             - spreadsheet
+//  МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки     - cells
+//  Лист        - Строка           - Имя листа (первый лист по умолчанию) - sheetname
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
+    
+    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear";
+    
+    СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
+        
+    Параметры = Новый Структура("ranges", МассивЯчеек);
+    Ответ     = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить значения ячеек
+// Получает значения ячеек таблицы
+// 
+// Параметры:
+//  Токен       - Строка           - Токен                                                              - token
+//  Книга       - Строка           - ID книги                                                           - spreadsheet
+//  МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено)  - cells
+//  Лист        - Строка           - Имя листа (первый лист по умолчанию)                               - sheetname
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+      
+    Заголовки    = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+    URL          = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet";
+  
+    Если ЗначениеЗаполнено(МассивЯчеек) Тогда
+        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);  
+        СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
+        
+        Первый = Истина;
+        Для Каждого Ячейка Из МассивЯчеек Цикл
+            Разделитель = ?(Первый, "?", "&");
+            URL         = URL + Разделитель + "ranges=" + Ячейка;
+            Первый      = Ложь;
+        КонецЦикла;
+    Иначе
+        URL = URL + "?ranges='" + Лист + "'";
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов)
+    
+    Для Каждого ИмяЛиста Из МассивИмен Цикл
+        
+        Лист = СоздатьЛист(ИмяЛиста);
+        МассивЛистов.Добавить(Лист);
+        
+    КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист)
+    
+    Если ЗначениеЗаполнено(Лист) Тогда
+		Ячейка     = "'" + Лист + "'!" + Ячейка;
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Функция СоздатьЛист(Знач Наименование)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    
+    СвойстваЛиста = Новый Структура("title"     , Наименование);
+    Лист          = Новый Структура("properties", СвойстваЛиста);
+
+    Возврат Лист;
+    
+КонецФункции
+
+Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
+    
+    МассивДанных = Новый Массив;
+    
+    Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл
+        
+        ТекущееЗначение = ДанныеЯчейки.Значение;
+        ТекущийКлюч     = ДанныеЯчейки.Ключ;
+        
+        ДобавитьИмяЛиста(ТекущийКлюч, Лист);
+        
+        OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение);
+        
+        ТекущиеДанные   = Новый Соответствие;
+        ТекущийМассив   = Новый Массив;
+        
+        ТекущийМассив.Добавить(ТекущееЗначение);
+        
+        OPI_Инструменты.ДобавитьПоле("range"         , ТекущийКлюч      , "Строка", ТекущиеДанные);
+        OPI_Инструменты.ДобавитьПоле("values"        , ТекущийМассив    , "Массив", ТекущиеДанные);
+        OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные);
+        
+        МассивДанных.Добавить(ТекущиеДанные);
+        
+    КонецЦикла;
+    
+    Возврат МассивДанных;
+    
+КонецФункции
+
+Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист)
+
+   OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); 
+   
+   Для Н = 0 По МассивИмен.ВГраница() Цикл       
+       ДобавитьИмяЛиста(МассивИмен[Н], Лист);
+   КонецЦикла;
+       
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_GoogleWorkspace.os b/src/ru/OInt/core/Modules/OPI_GoogleWorkspace.os
similarity index 97%
rename from ru/OInt/core/Modules/OPI_GoogleWorkspace.os
rename to src/ru/OInt/core/Modules/OPI_GoogleWorkspace.os
index 4fd739a8a3..bb65b18314 100644
--- a/ru/OInt/core/Modules/OPI_GoogleWorkspace.os
+++ b/src/ru/OInt/core/Modules/OPI_GoogleWorkspace.os
@@ -1,173 +1,173 @@
-// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os
-// Библиотека: Google Workspace
-// Команда CLI: google
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-// Сформировать ссылку получения кода
-// Возвращает URL для авторизации в браузере
-// 
-// Параметры:
-//  ClientID - Строка - Client ID                      - id
-//  Calendar - Булево - разрешение на методы Calendar  - calendar
-//  Drive    - Булево - разрешение на методы Drive     - drive
-//  Sheets   - Булево - разрешение на методы Sheets    - sheets
-// 
-// Возвращаемое значение:
-//  Строка - Ссылка получения кода
-Функция СформироватьСсылкуПолученияКода(Знач ClientID
-    , Знач Calendar = Истина
-    , Знач Drive = Истина
-    , Знач Sheets = Истина) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Drive);
-    
-    URL = "https://accounts.google.com/o/oauth2/auth";
-    
-    ПараметрыURL = Новый Структура;
-    ПараметрыURL.Вставить("response_type", "code");
-    ПараметрыURL.Вставить("client_id"    , ClientID);
-    ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
-    ПараметрыURL.Вставить("access_type"  , "offline");
-    ПараметрыURL.Вставить("scope"        , ПолучитьСписокРазрешений(Calendar, Drive, Sheets));
-    
-    URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
-    
-    Возврат URL;
-    
-КонецФункции
-
-// Получить токен по коду
-// Получает токен по коду из авторизации в бразуере
-// 
-// Параметры:
-//  ClientID     - Строка - Client ID        - id
-//  ClientSecret - Строка - Client secret    - secret
-//  Code         - Строка - Code из браузера - code
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Code);
-    
-    URL = "https://accounts.google.com/o/oauth2/token";
-           
-    ПараметрыURL = Новый Структура;
-    ПараметрыURL.Вставить("grant_type"   , "authorization_code");
-    ПараметрыURL.Вставить("client_id"    , ClientID);
-    ПараметрыURL.Вставить("client_secret", ClientSecret);
-    ПараметрыURL.Вставить("redirect_uri" , "http://localhost");  
-    ПараметрыURL.Вставить("code"         , Code);
-    
-    Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Обновить токен
-// Обновляет токен по Refresh token
-// 
-// Параметры:
-//  ClientID     - Строка - Client ID     - id
-//  ClientSecret - Строка - Client secret - secret
-//  RefreshToken - Строка - Refresh token - refresh
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
-    
-    URL = "https://accounts.google.com/o/oauth2/token";
-           
-    ПараметрыURL = Новый Структура;
-    ПараметрыURL.Вставить("grant_type"   , "refresh_token");
-    ПараметрыURL.Вставить("client_id"    , ClientID);
-    ПараметрыURL.Вставить("client_secret", ClientSecret);  
-    ПараметрыURL.Вставить("refresh_token", RefreshToken);
-    
-    Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Заголовки = Новый Соответствие;
-    Заголовки.Вставить("Authorization", "Bearer " + Токен);
-    
-    Возврат Заголовки;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИфункции
-
-Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets)
-    
-    МассивРазрешений = Новый Массив;
-    
-    Если Calendar Тогда
-        МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar");
-    КонецЕсли;
-    
-    Если Drive Тогда
-        МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive");
-    КонецЕсли;
-    
-    Если Sheets Тогда
-        МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets");
-    КонецЕсли;
-        
-    Возврат СтрСоединить(МассивРазрешений, " ");
-    
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os
+// Библиотека: Google Workspace
+// Команда CLI: google
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+// Сформировать ссылку получения кода
+// Возвращает URL для авторизации в браузере
+// 
+// Параметры:
+//  ClientID - Строка - Client ID                      - id
+//  Calendar - Булево - разрешение на методы Calendar  - calendar
+//  Drive    - Булево - разрешение на методы Drive     - drive
+//  Sheets   - Булево - разрешение на методы Sheets    - sheets
+// 
+// Возвращаемое значение:
+//  Строка - Ссылка получения кода
+Функция СформироватьСсылкуПолученияКода(Знач ClientID
+    , Знач Calendar = Истина
+    , Знач Drive = Истина
+    , Знач Sheets = Истина) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Drive);
+    
+    URL = "https://accounts.google.com/o/oauth2/auth";
+    
+    ПараметрыURL = Новый Структура;
+    ПараметрыURL.Вставить("response_type", "code");
+    ПараметрыURL.Вставить("client_id"    , ClientID);
+    ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
+    ПараметрыURL.Вставить("access_type"  , "offline");
+    ПараметрыURL.Вставить("scope"        , ПолучитьСписокРазрешений(Calendar, Drive, Sheets));
+    
+    URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
+    
+    Возврат URL;
+    
+КонецФункции
+
+// Получить токен по коду
+// Получает токен по коду из авторизации в бразуере
+// 
+// Параметры:
+//  ClientID     - Строка - Client ID        - id
+//  ClientSecret - Строка - Client secret    - secret
+//  Code         - Строка - Code из браузера - code
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Code);
+    
+    URL = "https://accounts.google.com/o/oauth2/token";
+           
+    ПараметрыURL = Новый Структура;
+    ПараметрыURL.Вставить("grant_type"   , "authorization_code");
+    ПараметрыURL.Вставить("client_id"    , ClientID);
+    ПараметрыURL.Вставить("client_secret", ClientSecret);
+    ПараметрыURL.Вставить("redirect_uri" , "http://localhost");  
+    ПараметрыURL.Вставить("code"         , Code);
+    
+    Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Обновить токен
+// Обновляет токен по Refresh token
+// 
+// Параметры:
+//  ClientID     - Строка - Client ID     - id
+//  ClientSecret - Строка - Client secret - secret
+//  RefreshToken - Строка - Refresh token - refresh
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
+    
+    URL = "https://accounts.google.com/o/oauth2/token";
+           
+    ПараметрыURL = Новый Структура;
+    ПараметрыURL.Вставить("grant_type"   , "refresh_token");
+    ПараметрыURL.Вставить("client_id"    , ClientID);
+    ПараметрыURL.Вставить("client_secret", ClientSecret);  
+    ПараметрыURL.Вставить("refresh_token", RefreshToken);
+    
+    Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Заголовки = Новый Соответствие;
+    Заголовки.Вставить("Authorization", "Bearer " + Токен);
+    
+    Возврат Заголовки;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИфункции
+
+Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets)
+    
+    МассивРазрешений = Новый Массив;
+    
+    Если Calendar Тогда
+        МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar");
+    КонецЕсли;
+    
+    Если Drive Тогда
+        МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive");
+    КонецЕсли;
+    
+    Если Sheets Тогда
+        МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets");
+    КонецЕсли;
+        
+    Возврат СтрСоединить(МассивРазрешений, " ");
+    
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Notion.os b/src/ru/OInt/core/Modules/OPI_Notion.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_Notion.os
rename to src/ru/OInt/core/Modules/OPI_Notion.os
index 9303abb4fa..fb9c068f55 100644
--- a/ru/OInt/core/Modules/OPI_Notion.os
+++ b/src/ru/OInt/core/Modules/OPI_Notion.os
@@ -1,889 +1,889 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Notion.os
-// Библиотека: Notion
-// Команда CLI: notion
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:UsingServiceTag-off
-
-// @skip-check method-too-many-params
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСоСтраницами
-
-// Создать страницу
-// Создает дочернюю страницу над другой страницей-родителем
-// 
-// Параметры:
-//  Токен     - Строка - Токен                  - token
-//  Родитель  - Строка - ID Родителя            - page
-//  Заголовок - Строка - Заголовок страницы     - title
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-    
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);   
-    Свойства  = Новый Структура;
-    Параметры = Новый Структура;
-    
-    ДобавитьЗаголовокСтраницы(Заголовок, Свойства);
-    ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры);
-    
-    Параметры.Вставить("properties", Свойства);
-    
-    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать страницу в базу
-// Создает страницу в базе-родителе
-// 
-// Параметры:
-//  Токен    - Строка                        - Токен                - token 
-//  Родитель - Строка                        - ID родительской базы - base
-//  Данные   - Соответствие Из КлючИЗначение - Соответствие свойств - data
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
-    
-    Заголовки  = СоздатьЗаголовкиЗапроса(Токен);
-    Параметры  = Новый Структура;
-    
-    ДобавитьРодителяСтраницы(Родитель, Истина, Параметры);
-
-    Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен);    
-    Параметры.Вставить("properties", Свойства);
-    
-    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить страницу
-// Получает информацию о странице по ID
-// 
-// Параметры:
-//  Токен    - Строка - Токен        - token
-//  Страница - Строка - ID страницы  - page 
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница);
-    
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
-    ПреобразоватьИД(Страница);  
-    
-    Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Изменить свойства страницы.
-// 
-// Параметры:
-//  Токен        - Строка                        - Токен                                   - token
-//  Страница     - Строка                        - ID изменяемой страницы                  - page
-//  Данные       - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров      - data
-//  Иконка       - Строка                        - URL картинки иконки страницы            - icon
-//  Обложка      - Строка                        - URL картинки обложки страницы           - cover
-//  Архивирована - Булево                        - Архивировать страницу или нет (булево)  - archive
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ИзменитьСвойстваСтраницы(Знач Токен
-    , Знач Страница
-    , Знач Данные = ""
-    , Знач Иконка = ""
-    , Знач Обложка = ""
-    , Знач Архивирована = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Иконка);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Обложка);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Архивирована);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
-    
-    Заголовки  = СоздатьЗаголовкиЗапроса(Токен);
-    Параметры  = Новый Структура;
-    Files      = "files";
-    
-    Если ЗначениеЗаполнено(Данные) 
-        И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда
-        Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь); 
-    Иначе 
-        Свойства = Новый Соответствие;
-    КонецЕсли;
-        
-    Если ЗначениеЗаполнено(Иконка) Тогда
-        СоответствиеИконки = Новый Соответствие;
-        СоответствиеИконки.Вставить("Icon", Иконка);
-        
-        ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки);
-        ОбъектИконка = ОбъектИконка[Files][0];
-        ОбъектИконка.Удалить("name");
-        
-        Параметры.Вставить("icon", ОбъектИконка);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Обложка) Тогда
-        СоответствиеОбложки = Новый Соответствие;
-        СоответствиеОбложки.Вставить("Cover", Обложка);
-
-        ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки);
-        ОбъектОбложка = ОбъектОбложка[Files][0];
-        ОбъектОбложка.Удалить("name");
-
-        Параметры.Вставить("cover", ОбъектОбложка);
-    КонецЕсли;
-
-    Параметры.Вставить("properties", Свойства);
-    Параметры.Вставить("archived"  , Архивирована);
-    
-    ПреобразоватьИД(Страница);
-
-    Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСБазамиДанных
-
-// Создать базу данных
-// Создает базу данных
-// 
-// Параметры:
-//  Токен     - Строка              - Токен                    - token 
-//  Родитель  - Строка              - ID страницы родителя     - page
-//  Заголовок - Строка              - Заголовок базы данных    - title
-//  Свойства  - Структура Из Строка - Свойства базы данных     - props
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства);
-    
-    // Пример структуры/соответствия свойств
-    
-    // Имя        : title
-    // Описание   : rich_text
-    // В работе   : checkbox 
-    // Количество : number
-    // Дата       : date
-    // Статус     : Соответствие
-    //               Активный   : green
-    //               Неактивный : red
-    //               Архив      : yellow
-    
-    // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя
-
-    Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда
-        Свойства = Новый Структура("Наименование", "title");
-    КонецЕсли;
-
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);     
-    Параметры = Новый Структура;
-    
-    ДобавитьРодителяБазы(Родитель, Ложь, Параметры);
-    ДобавитьЗаголовокБазы(Заголовок, Параметры);
-    ДобавитьСвойстваБазы(Свойства, Параметры);
-
-    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить базу данных
-// Получить данные о базе данных
-// 
-// Параметры:
-//  Токен - Строка - Токен          - token
-//  База  - Строка - ID базы данных - base
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт
-   
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
-    ПреобразоватьИД(База);  
-    
-    Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки);
-    
-    Возврат Ответ; 
-    
-КонецФункции
-
-// Изменить свойства базы
-// Изменяет свойства существующей базы
-// 
-// Параметры:
-//  Токен     - Строка                        - Токен                                     - token
-//  База      - Строка                        - ID целевой базы                           - base
-//  Свойства  - Соответствие из КлючИЗначение - Новые или изменяемые свойства базы данных - props
-//  Заголовок - Строка                        - Новый заголовок базы                      - title
-//  Описание  - Строка                        - Новое описание базы                       - description
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства);
-    
-    Параметры = Новый Структура;
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);  
-    ПреобразоватьИД(База); 
-    
-    Если ЗначениеЗаполнено(Заголовок) Тогда
-        ДобавитьЗаголовокБазы(Заголовок, Параметры);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Описание) Тогда
-        ДобавитьОписаниеБазы(Описание, Параметры);
-    КонецЕсли;
-    
-    Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда
-        ДобавитьСвойстваБазы(Свойства, Параметры);
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти 
-
-#Область РаботаСБлоками
-
-// Создать блок
-// Создает новый блок на основе существующего блока
-// 
-// Параметры:
-//  Токен         - Строка                               - Токен                                              - token
-//  Родитель      - Строка                               - ID родительского блока или страницы                - page
-//  Блок          - Строка,Соответствие Из КлючИЗначение - ID блока или сам блок образец                      - block
-//  ВставитьПосле - Строка                               - ID блока, после которого необходимо встаивть новый - prev
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт
-  
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ВставитьПосле);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блок);
-    
-    Если ТипЗнч(Блок) = Тип("Массив") Тогда
-        Блок = Блок[0];
-    КонецЕсли;
-    
-    Заголовки    = СоздатьЗаголовкиЗапроса(Токен); 
-    ПреобразоватьИД(Родитель);
-    
-    Если ТипЗнч(Блок) = Тип("Строка") Тогда
-        ПреобразоватьИД(Блок);
-        Блок = ВернутьБлок(Токен, Блок);
-    КонецЕсли;
-    
-    МассивБлоков = Новый Массив;
-    МассивБлоков.Добавить(Блок);
-    
-    Параметры = Новый Соответствие;
-    Параметры.Вставить("children", МассивБлоков);
-    
-    Если ЗначениеЗаполнено(ВставитьПосле) Тогда
-        Параметры.Вставить("after", ВставитьПосле);
-    КонецЕсли;
-    
-    URL   = "https://api.notion.com/v1/blocks/" + Родитель + "/children";
-    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-       
-КонецФункции
-
-// Вернуть блок.
-// 
-// Параметры:
-//  Токен        - Строка - Токен                                                         - token
-//  ИДБлока      - Строка - ID блока                                                      - block
-//  ТолькоОснова - Булево - Истина > служебные поля удаляются, остается только сам блок   - core
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоОснова);
-    
-    ПреобразоватьИД(ИДБлока);
-    
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
-    
-    Если ТолькоОснова Тогда
-        УдалитьЛишниеПоляБлока(Ответ);    
-    КонецЕсли;
-    
-    Возврат Ответ;
-        
-КонецФункции
-
-// Вернуть дочерние блоки
-// Созвращает список дочерних блоков блока-родителя
-// 
-// Параметры:
-//  Токен   - Строка - Токен             - token
-//  ИДБлока - Строка - ID блока родителя - block
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
-    
-    ПреобразоватьИД(ИДБлока);
-    
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить блок
-// Удаляет блок по ID
-// 
-// Параметры:
-//  Токен   - Строка - Токен    - token
-//  ИДБлока - Строка - ID блока - block
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
-    
-    ПреобразоватьИД(ИДБлока);
-    
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
-    
-    Возврат Ответ;
-        
-КонецФункции
-    
-#КонецОбласти
-
-#Область Пользователи
-
-// Список пользователей
-// Возвращает список пользователей рабочего пространства
-// 
-// Параметры:
-//  Токен - Строка - Токен - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СписокПользователей(Знач Токен) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки);
-    
-    Возврат Ответ;
-        
-КонецФункции
-
-// Получить данные пользователя
-// Получает данные пользователя по ID
-// 
-// Параметры:
-//  Токен          - Строка - Токен                     - token
-//  ИДПользователя - Строка - ID целевого пользователя  - user
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПользователя);
-    
-    ПреобразоватьИД(ИДПользователя);
-    
-    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
-    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция СоздатьЗаголовкиЗапроса(Знач Токен)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Заголовки = Новый Соответствие;
-    Заголовки.Вставить("Authorization" , "Bearer " + Токен);
-    Заголовки.Вставить("Notion-Version", "2022-06-28");
-    
-    Возврат Заголовки;
-        
-КонецФункции
-
-Процедура ПреобразоватьИД(Идентификатор)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-    
-    Идентификатор = СтрЗаменить(Идентификатор, "-", "");
-    
-КонецПроцедуры
-
-Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
-  
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза);
-    
-    ПреобразоватьИД(Родитель);
-  
-    ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
-    СтруктураРодителя  = Новый Структура(ПолеИдентификатора, Родитель);
-
-    ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
-     
-КонецПроцедуры
-
-Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
-  
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза);
-    
-    ПреобразоватьИД(Родитель);
-  
-    ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
-    
-    СтруктураРодителя  = Новый Структура();
-    СтруктураРодителя.Вставить("type"            , ПолеИдентификатора);
-    СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель);
-
-    ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
-     
-КонецПроцедуры
-
-Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура) 
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-    
-    ПодчиненнаяСтруктура = Новый Структура;
-    СтруктураДанных      = Новый Структура;
-    СтруктураТекста      = Новый Структура;
-    МассивДанных         = Новый Массив;
-    Title                = "title";
-    
-    СтруктураТекста.Вставить("content", Заголовок);
-    СтруктураТекста.Вставить("link"   , Неопределено);
-   
-    СтруктураДанных.Вставить("text", СтруктураТекста);
-    СтруктураДанных.Вставить("type", "text");
-    
-    МассивДанных.Добавить(СтруктураДанных);
-    
-    ПодчиненнаяСтруктура.Вставить("id"   , Title);
-    ПодчиненнаяСтруктура.Вставить("type" , Title);
-    ПодчиненнаяСтруктура.Вставить(Title  , МассивДанных);
-    
-    ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура);
-    
-КонецПроцедуры
-
-Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-    
-    Заголовок = ПреобразоватьЗаголовок(Заголовок);    
-    ОсновнаяСтруктура.Вставить("title", Заголовок["title"]);
-    
-КонецПроцедуры
-
-Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-    
-    Заголовок = ПреобразоватьЗаголовок(Описание);    
-    ОсновнаяСтруктура.Вставить("description", Заголовок["title"]);
-    
-КонецПроцедуры
-
-Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура)
-    
-    Если Свойства.Количество() = 0 Тогда
-       ОсновнаяСтруктура.Вставить("properties", Новый Структура);
-       Возврат;      
-    КонецЕсли;
-    
-    СоответствиеПараметров = Новый Соответствие;
-    
-    Для Каждого Свойство Из Свойства Цикл
-        
-        Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда
-            
-           СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура));
-           
-        ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура") 
-            Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда
-                
-            ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение);
-            СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения));
-            
-        Иначе
-            
-            СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение);
-            
-        КонецЕсли;
-        
-    КонецЦикла;
-    
-    ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров);
-    
-КонецПроцедуры
-
-Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов)
-    
-    МассивВариантов = Новый Массив;
-    
-    Для Каждого Вариант Из СтруктураВариантов Цикл
-        
-        СоответствиеВарианта = Новый Соответствие;
-        СоответствиеВарианта.Вставить("name" , Вариант.Ключ);
-        СоответствиеВарианта.Вставить("color", Вариант.Значение);
-        
-        МассивВариантов.Добавить(СоответствиеВарианта);
-                
-    КонецЦикла;
-    
-    Возврат Новый Структура("options", МассивВариантов);
-        
-КонецФункции
-
-Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина)
-    
-    Если ЭтоБаза Тогда
-        ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема);
-    Иначе
-        ДанныеСхемы = ПолучитьСтраницу(Токен, Схема);    
-    КонецЕсли;
-    
-    ПоляБазы   = ДанныеСхемы["properties"];
-    Свойства   = Новый Соответствие;
-    
-    Если ЗначениеЗаполнено(ПоляБазы) Тогда
-        
-        Для Каждого Поле Из ПоляБазы Цикл
-            
-            ДанныеПоля = Поле.Значение;
-            ТипПоля    = ДанныеПоля["type"];
-            
-            ЗаполняемыеДанные = Данные.Получить(Поле.Ключ);
-            
-            Если ЗаполняемыеДанные = Неопределено Тогда
-                Продолжить;
-            КонецЕсли;
-            
-            ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные);
-            
-            Если ПреобразованныеДанные = Неопределено Тогда
-                Продолжить;
-            КонецЕсли;
-            
-            Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные); 
-            
-        КонецЦикла;
-        
-    КонецЕсли;
-
-    Возврат Свойства;
-
-КонецФункции
-
-Процедура УдалитьЛишниеПоляБлока(Знач Блок)
-    
-    МассивЛишних = Новый Массив;
-    МассивЛишних.Добавить("request_id");
-    МассивЛишних.Добавить("archived");
-    МассивЛишних.Добавить("created_by");
-    МассивЛишних.Добавить("last_edited_time");
-    МассивЛишних.Добавить("created_time");
-    МассивЛишних.Добавить("has_children");
-    МассивЛишних.Добавить("parrent");
-    МассивЛишних.Добавить("last_edited_by");
-    МассивЛишних.Добавить("id");
-    
-    Для Каждого Поле Из МассивЛишних Цикл
-        
-        Если Не Блок.Получить(Поле) = Неопределено Тогда
-            Блок.Удалить(Поле);
-        КонецЕсли;
-        
-    КонецЦикла;
-    
-КонецПроцедуры
-
-#Область ПреобразованиеТипов
-
-Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение)
-    
-    Если Тип = "title" Тогда
-        Возврат ПреобразоватьЗаголовок(Значение);
-    ИначеЕсли Тип = "rich_text" Тогда
-        Возврат ПреобразоватьТекст(Значение);
-    ИначеЕсли Тип = "number" Тогда
-        Возврат ПреобразоватьЧисло(Значение);
-    ИначеЕсли Тип = "select" Тогда
-        Возврат ПреобразоватьВариантВыбора(Значение);
-    ИначеЕсли Тип = "multi_select" Тогда
-        Возврат ПреобразоватьМножественныйВыбор(Значение);
-    ИначеЕсли Тип = "status" Тогда
-        Возврат ПреобразоватьСтатус(Значение);
-    ИначеЕсли Тип = "date" Тогда
-        Возврат ПреобразоватьДату(Значение);
-    ИначеЕсли Тип = "relation" Тогда
-        Возврат ПреобразоватьСвязь(Значение);
-    ИначеЕсли Тип = "people" Тогда
-        Возврат ПреобразоватьПользователей(Значение);
-    ИначеЕсли Тип = "files" Тогда
-        Возврат ПреобразоватьФайлы(Значение);
-    ИначеЕсли Тип = "checkbox" Тогда
-        Возврат ПреобразоватьБулево(Значение);
-    ИначеЕсли Тип = "url" Тогда
-        Возврат ПреобразоватьСсылку(Значение);
-    ИначеЕсли Тип = "email" Тогда
-        Возврат ПреобразоватьПочту(Значение);
-    ИначеЕсли Тип = "phone_number" Тогда
-        Возврат ПреобразоватьТелефон(Значение);
-    Иначе 
-        Возврат Неопределено;
-    КонецЕсли;
-    
-КонецФункции
-
-Функция ПреобразоватьЗаголовок(Знач Заголовок) 
-    
-    СтруктураДанных      = Новый Структура;
-    СтруктураТекста      = Новый Структура;
-    МассивДанных         = Новый Массив;
-    
-    СтруктураТекста.Вставить("content", Заголовок);
-    СтруктураТекста.Вставить("link"   , Неопределено);
-    
-    СтруктураДанных.Вставить("type", "text");
-    СтруктураДанных.Вставить("text", СтруктураТекста);
-       
-    МассивДанных.Добавить(СтруктураДанных);
-
-    Возврат Новый Структура("title", МассивДанных);
-    
-КонецФункции
-
-Функция ПреобразоватьТекст(Знач Текст)
-    
-    МассивТекста    = Новый Массив;
-    СтруктураТекста = Новый Структура;
-    
-    СтруктураТекста.Вставить("type", "text");
-    СтруктураТекста.Вставить("text", Новый Структура("content", Текст));
-    
-    МассивТекста.Добавить(СтруктураТекста);
-    
-    Возврат Новый Структура("rich_text", МассивТекста);
-    
-КонецФункции
-
-Функция ПреобразоватьЧисло(Знач Число)
-    Возврат Новый Структура("number", Число);
-КонецФункции
-
-Функция ПреобразоватьВариантВыбора(Знач Вариант)
-    
-    СтруктураВыбора = Новый Структура;
-    СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант));
-    
-    Возврат СтруктураВыбора;
-    
-КонецФункции
-
-Функция ПреобразоватьСтатус(Знач Статус)
-    
-    СтруктураСтатуса = Новый Структура;
-    СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус));
-    
-    Возврат СтруктураСтатуса;
-    
-КонецФункции
-
-Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов)
-    
-    МассивВариантовВыбора = Новый Массив;
-    
-    Для Каждого Вариант Из МассивВариантов Цикл
-        МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант));
-    КонецЦикла;
-    
-    Возврат Новый Структура("multi_select", МассивВариантовВыбора);
-    
-КонецФункции
-
-Функция ПреобразоватьДату(Знач Дата)
-    
-    СтруктураДаты = Новый Структура;
-    
-    Если Дата = НачалоДня(Дата) Тогда
-        ФорматДаты = "ДФ=yyyy-MM-dd";
-    Иначе
-        ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ";
-    КонецЕсли;
-    
-    Дата = Формат(Дата, ФорматДаты);
-    СтруктураДаты.Вставить("start", Дата);
-    
-    Возврат Новый Структура("date", СтруктураДаты);
-    
-КонецФункции
-
-Функция ПреобразоватьСвязь(Знач Идентификатор) 
-    
-    МассивСвязи = Новый Массив;
-    МассивСвязи.Добавить(Новый Структура("id", Идентификатор));
-    
-    Возврат Новый Структура("relation", МассивСвязи);
-    
-КонецФункции
-
-Функция ПреобразоватьПользователей(Знач МассивИД)
-    
-    Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда
-        МассивИД_ = Новый Массив;
-        МассивИД_.Добавить(МассивИД);
-        МассивИД = МассивИД_;
-    КонецЕсли;
-    
-    МассивПользователей = Новый Массив;
-    
-    Для Каждого Идентификатор Из МассивИД Цикл
-        
-        СтруктураПользователя = Новый Структура;
-        СтруктураПользователя.Вставить("object", "user");
-        СтруктураПользователя.Вставить("id"    , Идентификатор);
-        МассивПользователей.Добавить(СтруктураПользователя);
-        
-    КонецЦикла;
-    
-    Возврат Новый Структура("people", МассивПользователей);
-    
-КонецФункции
-
-Функция ПреобразоватьФайлы(Знач СоответствиеФайлов)
-        
-    МассивФайлов = Новый Массив;
-    
-    Для Каждого Файл Из СоответствиеФайлов Цикл
-        
-        СтруктураФайла = Новый Структура;
-        СтруктураФайла.Вставить("type"    , "external");
-        СтруктураФайла.Вставить("name"    , Файл.Ключ);
-        СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение));
-        
-        МассивФайлов.Добавить(СтруктураФайла);
-        
-    КонецЦикла;
-
-    Возврат Новый Структура("files", МассивФайлов);
-    
-КонецФункции
-
-Функция ПреобразоватьБулево(Знач Булево)
-    Возврат Новый Структура("checkbox", Булево);
-КонецФункции
-
-Функция ПреобразоватьСсылку(Знач URL)
-    Возврат Новый Структура("url", URL);
-КонецФункции
-
-Функция ПреобразоватьПочту(Знач Почта)
-    Возврат Новый Структура("email", Почта);
-КонецФункции
-
-Функция ПреобразоватьТелефон(Знач Телефон)
-    Возврат Новый Структура("phone_number", Телефон);
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Notion.os
+// Библиотека: Notion
+// Команда CLI: notion
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+
+// @skip-check method-too-many-params
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСоСтраницами
+
+// Создать страницу
+// Создает дочернюю страницу над другой страницей-родителем
+// 
+// Параметры:
+//  Токен     - Строка - Токен                  - token
+//  Родитель  - Строка - ID Родителя            - page
+//  Заголовок - Строка - Заголовок страницы     - title
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+    
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);   
+    Свойства  = Новый Структура;
+    Параметры = Новый Структура;
+    
+    ДобавитьЗаголовокСтраницы(Заголовок, Свойства);
+    ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры);
+    
+    Параметры.Вставить("properties", Свойства);
+    
+    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать страницу в базу
+// Создает страницу в базе-родителе
+// 
+// Параметры:
+//  Токен    - Строка                        - Токен                - token 
+//  Родитель - Строка                        - ID родительской базы - base
+//  Данные   - Соответствие Из КлючИЗначение - Соответствие свойств - data
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
+    
+    Заголовки  = СоздатьЗаголовкиЗапроса(Токен);
+    Параметры  = Новый Структура;
+    
+    ДобавитьРодителяСтраницы(Родитель, Истина, Параметры);
+
+    Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен);    
+    Параметры.Вставить("properties", Свойства);
+    
+    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить страницу
+// Получает информацию о странице по ID
+// 
+// Параметры:
+//  Токен    - Строка - Токен        - token
+//  Страница - Строка - ID страницы  - page 
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница);
+    
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+    ПреобразоватьИД(Страница);  
+    
+    Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Изменить свойства страницы.
+// 
+// Параметры:
+//  Токен        - Строка                        - Токен                                   - token
+//  Страница     - Строка                        - ID изменяемой страницы                  - page
+//  Данные       - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров      - data
+//  Иконка       - Строка                        - URL картинки иконки страницы            - icon
+//  Обложка      - Строка                        - URL картинки обложки страницы           - cover
+//  Архивирована - Булево                        - Архивировать страницу или нет (булево)  - archive
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ИзменитьСвойстваСтраницы(Знач Токен
+    , Знач Страница
+    , Знач Данные = ""
+    , Знач Иконка = ""
+    , Знач Обложка = ""
+    , Знач Архивирована = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Иконка);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Обложка);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Архивирована);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
+    
+    Заголовки  = СоздатьЗаголовкиЗапроса(Токен);
+    Параметры  = Новый Структура;
+    Files      = "files";
+    
+    Если ЗначениеЗаполнено(Данные) 
+        И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда
+        Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь); 
+    Иначе 
+        Свойства = Новый Соответствие;
+    КонецЕсли;
+        
+    Если ЗначениеЗаполнено(Иконка) Тогда
+        СоответствиеИконки = Новый Соответствие;
+        СоответствиеИконки.Вставить("Icon", Иконка);
+        
+        ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки);
+        ОбъектИконка = ОбъектИконка[Files][0];
+        ОбъектИконка.Удалить("name");
+        
+        Параметры.Вставить("icon", ОбъектИконка);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Обложка) Тогда
+        СоответствиеОбложки = Новый Соответствие;
+        СоответствиеОбложки.Вставить("Cover", Обложка);
+
+        ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки);
+        ОбъектОбложка = ОбъектОбложка[Files][0];
+        ОбъектОбложка.Удалить("name");
+
+        Параметры.Вставить("cover", ОбъектОбложка);
+    КонецЕсли;
+
+    Параметры.Вставить("properties", Свойства);
+    Параметры.Вставить("archived"  , Архивирована);
+    
+    ПреобразоватьИД(Страница);
+
+    Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСБазамиДанных
+
+// Создать базу данных
+// Создает базу данных
+// 
+// Параметры:
+//  Токен     - Строка              - Токен                    - token 
+//  Родитель  - Строка              - ID страницы родителя     - page
+//  Заголовок - Строка              - Заголовок базы данных    - title
+//  Свойства  - Структура Из Строка - Свойства базы данных     - props
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства);
+    
+    // Пример структуры/соответствия свойств
+    
+    // Имя        : title
+    // Описание   : rich_text
+    // В работе   : checkbox 
+    // Количество : number
+    // Дата       : date
+    // Статус     : Соответствие
+    //               Активный   : green
+    //               Неактивный : red
+    //               Архив      : yellow
+    
+    // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя
+
+    Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда
+        Свойства = Новый Структура("Наименование", "title");
+    КонецЕсли;
+
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);     
+    Параметры = Новый Структура;
+    
+    ДобавитьРодителяБазы(Родитель, Ложь, Параметры);
+    ДобавитьЗаголовокБазы(Заголовок, Параметры);
+    ДобавитьСвойстваБазы(Свойства, Параметры);
+
+    Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить базу данных
+// Получить данные о базе данных
+// 
+// Параметры:
+//  Токен - Строка - Токен          - token
+//  База  - Строка - ID базы данных - base
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт
+   
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+    ПреобразоватьИД(База);  
+    
+    Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки);
+    
+    Возврат Ответ; 
+    
+КонецФункции
+
+// Изменить свойства базы
+// Изменяет свойства существующей базы
+// 
+// Параметры:
+//  Токен     - Строка                        - Токен                                     - token
+//  База      - Строка                        - ID целевой базы                           - base
+//  Свойства  - Соответствие из КлючИЗначение - Новые или изменяемые свойства базы данных - props
+//  Заголовок - Строка                        - Новый заголовок базы                      - title
+//  Описание  - Строка                        - Новое описание базы                       - description
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства);
+    
+    Параметры = Новый Структура;
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);  
+    ПреобразоватьИД(База); 
+    
+    Если ЗначениеЗаполнено(Заголовок) Тогда
+        ДобавитьЗаголовокБазы(Заголовок, Параметры);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Описание) Тогда
+        ДобавитьОписаниеБазы(Описание, Параметры);
+    КонецЕсли;
+    
+    Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда
+        ДобавитьСвойстваБазы(Свойства, Параметры);
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти 
+
+#Область РаботаСБлоками
+
+// Создать блок
+// Создает новый блок на основе существующего блока
+// 
+// Параметры:
+//  Токен         - Строка                               - Токен                                              - token
+//  Родитель      - Строка                               - ID родительского блока или страницы                - page
+//  Блок          - Строка,Соответствие Из КлючИЗначение - ID блока или сам блок образец                      - block
+//  ВставитьПосле - Строка                               - ID блока, после которого необходимо встаивть новый - prev
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт
+  
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ВставитьПосле);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блок);
+    
+    Если ТипЗнч(Блок) = Тип("Массив") Тогда
+        Блок = Блок[0];
+    КонецЕсли;
+    
+    Заголовки    = СоздатьЗаголовкиЗапроса(Токен); 
+    ПреобразоватьИД(Родитель);
+    
+    Если ТипЗнч(Блок) = Тип("Строка") Тогда
+        ПреобразоватьИД(Блок);
+        Блок = ВернутьБлок(Токен, Блок);
+    КонецЕсли;
+    
+    МассивБлоков = Новый Массив;
+    МассивБлоков.Добавить(Блок);
+    
+    Параметры = Новый Соответствие;
+    Параметры.Вставить("children", МассивБлоков);
+    
+    Если ЗначениеЗаполнено(ВставитьПосле) Тогда
+        Параметры.Вставить("after", ВставитьПосле);
+    КонецЕсли;
+    
+    URL   = "https://api.notion.com/v1/blocks/" + Родитель + "/children";
+    Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+       
+КонецФункции
+
+// Вернуть блок.
+// 
+// Параметры:
+//  Токен        - Строка - Токен                                                         - token
+//  ИДБлока      - Строка - ID блока                                                      - block
+//  ТолькоОснова - Булево - Истина > служебные поля удаляются, остается только сам блок   - core
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоОснова);
+    
+    ПреобразоватьИД(ИДБлока);
+    
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
+    
+    Если ТолькоОснова Тогда
+        УдалитьЛишниеПоляБлока(Ответ);    
+    КонецЕсли;
+    
+    Возврат Ответ;
+        
+КонецФункции
+
+// Вернуть дочерние блоки
+// Созвращает список дочерних блоков блока-родителя
+// 
+// Параметры:
+//  Токен   - Строка - Токен             - token
+//  ИДБлока - Строка - ID блока родителя - block
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
+    
+    ПреобразоватьИД(ИДБлока);
+    
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить блок
+// Удаляет блок по ID
+// 
+// Параметры:
+//  Токен   - Строка - Токен    - token
+//  ИДБлока - Строка - ID блока - block
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
+    
+    ПреобразоватьИД(ИДБлока);
+    
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
+    
+    Возврат Ответ;
+        
+КонецФункции
+    
+#КонецОбласти
+
+#Область Пользователи
+
+// Список пользователей
+// Возвращает список пользователей рабочего пространства
+// 
+// Параметры:
+//  Токен - Строка - Токен - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СписокПользователей(Знач Токен) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки);
+    
+    Возврат Ответ;
+        
+КонецФункции
+
+// Получить данные пользователя
+// Получает данные пользователя по ID
+// 
+// Параметры:
+//  Токен          - Строка - Токен                     - token
+//  ИДПользователя - Строка - ID целевого пользователя  - user
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПользователя);
+    
+    ПреобразоватьИД(ИДПользователя);
+    
+    Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+    Ответ     = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция СоздатьЗаголовкиЗапроса(Знач Токен)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Заголовки = Новый Соответствие;
+    Заголовки.Вставить("Authorization" , "Bearer " + Токен);
+    Заголовки.Вставить("Notion-Version", "2022-06-28");
+    
+    Возврат Заголовки;
+        
+КонецФункции
+
+Процедура ПреобразоватьИД(Идентификатор)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+    
+    Идентификатор = СтрЗаменить(Идентификатор, "-", "");
+    
+КонецПроцедуры
+
+Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
+  
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза);
+    
+    ПреобразоватьИД(Родитель);
+  
+    ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
+    СтруктураРодителя  = Новый Структура(ПолеИдентификатора, Родитель);
+
+    ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
+     
+КонецПроцедуры
+
+Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
+  
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза);
+    
+    ПреобразоватьИД(Родитель);
+  
+    ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
+    
+    СтруктураРодителя  = Новый Структура();
+    СтруктураРодителя.Вставить("type"            , ПолеИдентификатора);
+    СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель);
+
+    ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
+     
+КонецПроцедуры
+
+Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура) 
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+    
+    ПодчиненнаяСтруктура = Новый Структура;
+    СтруктураДанных      = Новый Структура;
+    СтруктураТекста      = Новый Структура;
+    МассивДанных         = Новый Массив;
+    Title                = "title";
+    
+    СтруктураТекста.Вставить("content", Заголовок);
+    СтруктураТекста.Вставить("link"   , Неопределено);
+   
+    СтруктураДанных.Вставить("text", СтруктураТекста);
+    СтруктураДанных.Вставить("type", "text");
+    
+    МассивДанных.Добавить(СтруктураДанных);
+    
+    ПодчиненнаяСтруктура.Вставить("id"   , Title);
+    ПодчиненнаяСтруктура.Вставить("type" , Title);
+    ПодчиненнаяСтруктура.Вставить(Title  , МассивДанных);
+    
+    ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура);
+    
+КонецПроцедуры
+
+Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+    
+    Заголовок = ПреобразоватьЗаголовок(Заголовок);    
+    ОсновнаяСтруктура.Вставить("title", Заголовок["title"]);
+    
+КонецПроцедуры
+
+Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+    
+    Заголовок = ПреобразоватьЗаголовок(Описание);    
+    ОсновнаяСтруктура.Вставить("description", Заголовок["title"]);
+    
+КонецПроцедуры
+
+Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура)
+    
+    Если Свойства.Количество() = 0 Тогда
+       ОсновнаяСтруктура.Вставить("properties", Новый Структура);
+       Возврат;      
+    КонецЕсли;
+    
+    СоответствиеПараметров = Новый Соответствие;
+    
+    Для Каждого Свойство Из Свойства Цикл
+        
+        Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда
+            
+           СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура));
+           
+        ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура") 
+            Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда
+                
+            ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение);
+            СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения));
+            
+        Иначе
+            
+            СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение);
+            
+        КонецЕсли;
+        
+    КонецЦикла;
+    
+    ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров);
+    
+КонецПроцедуры
+
+Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов)
+    
+    МассивВариантов = Новый Массив;
+    
+    Для Каждого Вариант Из СтруктураВариантов Цикл
+        
+        СоответствиеВарианта = Новый Соответствие;
+        СоответствиеВарианта.Вставить("name" , Вариант.Ключ);
+        СоответствиеВарианта.Вставить("color", Вариант.Значение);
+        
+        МассивВариантов.Добавить(СоответствиеВарианта);
+                
+    КонецЦикла;
+    
+    Возврат Новый Структура("options", МассивВариантов);
+        
+КонецФункции
+
+Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина)
+    
+    Если ЭтоБаза Тогда
+        ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема);
+    Иначе
+        ДанныеСхемы = ПолучитьСтраницу(Токен, Схема);    
+    КонецЕсли;
+    
+    ПоляБазы   = ДанныеСхемы["properties"];
+    Свойства   = Новый Соответствие;
+    
+    Если ЗначениеЗаполнено(ПоляБазы) Тогда
+        
+        Для Каждого Поле Из ПоляБазы Цикл
+            
+            ДанныеПоля = Поле.Значение;
+            ТипПоля    = ДанныеПоля["type"];
+            
+            ЗаполняемыеДанные = Данные.Получить(Поле.Ключ);
+            
+            Если ЗаполняемыеДанные = Неопределено Тогда
+                Продолжить;
+            КонецЕсли;
+            
+            ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные);
+            
+            Если ПреобразованныеДанные = Неопределено Тогда
+                Продолжить;
+            КонецЕсли;
+            
+            Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные); 
+            
+        КонецЦикла;
+        
+    КонецЕсли;
+
+    Возврат Свойства;
+
+КонецФункции
+
+Процедура УдалитьЛишниеПоляБлока(Знач Блок)
+    
+    МассивЛишних = Новый Массив;
+    МассивЛишних.Добавить("request_id");
+    МассивЛишних.Добавить("archived");
+    МассивЛишних.Добавить("created_by");
+    МассивЛишних.Добавить("last_edited_time");
+    МассивЛишних.Добавить("created_time");
+    МассивЛишних.Добавить("has_children");
+    МассивЛишних.Добавить("parrent");
+    МассивЛишних.Добавить("last_edited_by");
+    МассивЛишних.Добавить("id");
+    
+    Для Каждого Поле Из МассивЛишних Цикл
+        
+        Если Не Блок.Получить(Поле) = Неопределено Тогда
+            Блок.Удалить(Поле);
+        КонецЕсли;
+        
+    КонецЦикла;
+    
+КонецПроцедуры
+
+#Область ПреобразованиеТипов
+
+Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение)
+    
+    Если Тип = "title" Тогда
+        Возврат ПреобразоватьЗаголовок(Значение);
+    ИначеЕсли Тип = "rich_text" Тогда
+        Возврат ПреобразоватьТекст(Значение);
+    ИначеЕсли Тип = "number" Тогда
+        Возврат ПреобразоватьЧисло(Значение);
+    ИначеЕсли Тип = "select" Тогда
+        Возврат ПреобразоватьВариантВыбора(Значение);
+    ИначеЕсли Тип = "multi_select" Тогда
+        Возврат ПреобразоватьМножественныйВыбор(Значение);
+    ИначеЕсли Тип = "status" Тогда
+        Возврат ПреобразоватьСтатус(Значение);
+    ИначеЕсли Тип = "date" Тогда
+        Возврат ПреобразоватьДату(Значение);
+    ИначеЕсли Тип = "relation" Тогда
+        Возврат ПреобразоватьСвязь(Значение);
+    ИначеЕсли Тип = "people" Тогда
+        Возврат ПреобразоватьПользователей(Значение);
+    ИначеЕсли Тип = "files" Тогда
+        Возврат ПреобразоватьФайлы(Значение);
+    ИначеЕсли Тип = "checkbox" Тогда
+        Возврат ПреобразоватьБулево(Значение);
+    ИначеЕсли Тип = "url" Тогда
+        Возврат ПреобразоватьСсылку(Значение);
+    ИначеЕсли Тип = "email" Тогда
+        Возврат ПреобразоватьПочту(Значение);
+    ИначеЕсли Тип = "phone_number" Тогда
+        Возврат ПреобразоватьТелефон(Значение);
+    Иначе 
+        Возврат Неопределено;
+    КонецЕсли;
+    
+КонецФункции
+
+Функция ПреобразоватьЗаголовок(Знач Заголовок) 
+    
+    СтруктураДанных      = Новый Структура;
+    СтруктураТекста      = Новый Структура;
+    МассивДанных         = Новый Массив;
+    
+    СтруктураТекста.Вставить("content", Заголовок);
+    СтруктураТекста.Вставить("link"   , Неопределено);
+    
+    СтруктураДанных.Вставить("type", "text");
+    СтруктураДанных.Вставить("text", СтруктураТекста);
+       
+    МассивДанных.Добавить(СтруктураДанных);
+
+    Возврат Новый Структура("title", МассивДанных);
+    
+КонецФункции
+
+Функция ПреобразоватьТекст(Знач Текст)
+    
+    МассивТекста    = Новый Массив;
+    СтруктураТекста = Новый Структура;
+    
+    СтруктураТекста.Вставить("type", "text");
+    СтруктураТекста.Вставить("text", Новый Структура("content", Текст));
+    
+    МассивТекста.Добавить(СтруктураТекста);
+    
+    Возврат Новый Структура("rich_text", МассивТекста);
+    
+КонецФункции
+
+Функция ПреобразоватьЧисло(Знач Число)
+    Возврат Новый Структура("number", Число);
+КонецФункции
+
+Функция ПреобразоватьВариантВыбора(Знач Вариант)
+    
+    СтруктураВыбора = Новый Структура;
+    СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант));
+    
+    Возврат СтруктураВыбора;
+    
+КонецФункции
+
+Функция ПреобразоватьСтатус(Знач Статус)
+    
+    СтруктураСтатуса = Новый Структура;
+    СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус));
+    
+    Возврат СтруктураСтатуса;
+    
+КонецФункции
+
+Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов)
+    
+    МассивВариантовВыбора = Новый Массив;
+    
+    Для Каждого Вариант Из МассивВариантов Цикл
+        МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант));
+    КонецЦикла;
+    
+    Возврат Новый Структура("multi_select", МассивВариантовВыбора);
+    
+КонецФункции
+
+Функция ПреобразоватьДату(Знач Дата)
+    
+    СтруктураДаты = Новый Структура;
+    
+    Если Дата = НачалоДня(Дата) Тогда
+        ФорматДаты = "ДФ=yyyy-MM-dd";
+    Иначе
+        ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ";
+    КонецЕсли;
+    
+    Дата = Формат(Дата, ФорматДаты);
+    СтруктураДаты.Вставить("start", Дата);
+    
+    Возврат Новый Структура("date", СтруктураДаты);
+    
+КонецФункции
+
+Функция ПреобразоватьСвязь(Знач Идентификатор) 
+    
+    МассивСвязи = Новый Массив;
+    МассивСвязи.Добавить(Новый Структура("id", Идентификатор));
+    
+    Возврат Новый Структура("relation", МассивСвязи);
+    
+КонецФункции
+
+Функция ПреобразоватьПользователей(Знач МассивИД)
+    
+    Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда
+        МассивИД_ = Новый Массив;
+        МассивИД_.Добавить(МассивИД);
+        МассивИД = МассивИД_;
+    КонецЕсли;
+    
+    МассивПользователей = Новый Массив;
+    
+    Для Каждого Идентификатор Из МассивИД Цикл
+        
+        СтруктураПользователя = Новый Структура;
+        СтруктураПользователя.Вставить("object", "user");
+        СтруктураПользователя.Вставить("id"    , Идентификатор);
+        МассивПользователей.Добавить(СтруктураПользователя);
+        
+    КонецЦикла;
+    
+    Возврат Новый Структура("people", МассивПользователей);
+    
+КонецФункции
+
+Функция ПреобразоватьФайлы(Знач СоответствиеФайлов)
+        
+    МассивФайлов = Новый Массив;
+    
+    Для Каждого Файл Из СоответствиеФайлов Цикл
+        
+        СтруктураФайла = Новый Структура;
+        СтруктураФайла.Вставить("type"    , "external");
+        СтруктураФайла.Вставить("name"    , Файл.Ключ);
+        СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение));
+        
+        МассивФайлов.Добавить(СтруктураФайла);
+        
+    КонецЦикла;
+
+    Возврат Новый Структура("files", МассивФайлов);
+    
+КонецФункции
+
+Функция ПреобразоватьБулево(Знач Булево)
+    Возврат Новый Структура("checkbox", Булево);
+КонецФункции
+
+Функция ПреобразоватьСсылку(Знач URL)
+    Возврат Новый Структура("url", URL);
+КонецФункции
+
+Функция ПреобразоватьПочту(Знач Почта)
+    Возврат Новый Структура("email", Почта);
+КонецФункции
+
+Функция ПреобразоватьТелефон(Знач Телефон)
+    Возврат Новый Структура("phone_number", Телефон);
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Slack.os b/src/ru/OInt/core/Modules/OPI_Slack.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_Slack.os
rename to src/ru/OInt/core/Modules/OPI_Slack.os
index 237f9bc5fd..7ec31af5b4 100644
--- a/ru/OInt/core/Modules/OPI_Slack.os
+++ b/src/ru/OInt/core/Modules/OPI_Slack.os
@@ -1,1055 +1,1055 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Slack.os
-// Библиотека: Slack
-// Команда CLI: slack
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:Typo-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область УправлениеИНастройки
-
-// Получить информацию о боте
-// Получает основную информацию о боте
-// 
-// Параметры:
-//  Токен - Строка - Токен бота - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack 
-Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт
-    
-    URL       = "https://slack.com/api/auth.test";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить список рабочих областей
-// Получает список рабочих областей, в которых подключен бот
-// 
-// Параметры:
-//  Токен  - Строка - Токен бота                                                    - token
-//  Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокРабочихОбластей(Знач Токен, Знач Курсор = "") Экспорт
-    
-    URL   = "https://slack.com/api/auth.teams.list";
-    Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить список пользователей
-// Получает список пользователей рабочей области
-// 
-// Параметры:
-//  Токен  - Строка - Токен бота                                                    - token
-//  Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокПользователей(Знач Токен, Знач Курсор = "") Экспорт
-    
-    URL   = "https://slack.com/api/users.list";
-    Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаССообщениями
-
-// Отправить сообщение
-// Отправляет сообщение в выбранный час
-// 
-// Параметры:
-//  Токен        - Строка - Токен бота                              - token
-//  Канал        - Строка - Идентификатор канала                    - channel
-//  Текст        - Строка - Текст сообщения                         - text
-//  ДатаОтправки - Дата   - Дата отправки для отложенного сообщения - date 
-//  Блоки        - Массив Из Структура - Массив описаний блоков     - blocks - JSON массива описаний блоков
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст = "", Знач ДатаОтправки = "", Знач Блоки = "") Экспорт
-      
-    Строка_   = "Строка";
-    ЕстьДата  = ЗначениеЗаполнено(ДатаОтправки); 
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Если ЗначениеЗаполнено(Блоки) И ТипЗнч(Блоки) = Тип(Строка_) Тогда
-        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки);
-        
-        Если ТипЗнч(Блоки) = Тип("Массив") Тогда
-            
-            Для Н = 0 По Блоки.ВГраница() Цикл
-                OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки[Н]);                    
-            КонецЦикла;
-            
-        КонецЕсли;
-
-    КонецЕсли;
-        
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал, Строка_    , Параметры);
-    OPI_Инструменты.ДобавитьПоле("text"   , Текст, Строка_    , Параметры);
-    OPI_Инструменты.ДобавитьПоле("blocks" , Блоки, "Массив"   , Параметры);
-
-    Если ЕстьДата Тогда
-        
-        URL      = "https://slack.com/api/chat.scheduleMessage";
-        OPI_Инструменты.ДобавитьПоле("post_at", ДатаОтправки, "Дата", Параметры); 
-        
-    Иначе
-        
-        URL = "https://slack.com/api/chat.postMessage";
-        
-    КонецЕсли;
-          
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Отправить эфемерное сообщение
-// Отправляет сообщение, которое приходит в канал, но видно 
-// только конкретному пользователю
-// 
-// Параметры:
-//  Токен        - Строка - Токен бота                              - token
-//  Канал        - Строка - Идентификатор канала                    - channel
-//  Текст        - Строка - Текст сообщения                         - text
-//  Пользователь - Строка - ID пользователя                         - user 
-//  Блоки        - Массив Из Структура - Массив описаний блоков     - blocks - JSON массива описаний блоков
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ОтправитьЭфемерноеСообщение(Знач Токен
-    , Знач Канал
-    , Знач Текст = ""
-    , Знач Пользователь = ""
-    , Знач Блоки = "") Экспорт
-    
-    Строка_ = "Строка";
-    
-    Если ЗначениеЗаполнено(Блоки) И Не ТипЗнч(Блоки) = Тип(Строка_) Тогда
-        OPI_ПреобразованиеТипов.ПолучитьМассив(Блоки);
-    КонецЕсли;
-    
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал       , Строка_    , Параметры);
-    OPI_Инструменты.ДобавитьПоле("text"   , Текст       , Строка_    , Параметры);
-    OPI_Инструменты.ДобавитьПоле("user"   , Пользователь, Строка_    , Параметры);
-    OPI_Инструменты.ДобавитьПоле("blocks" , Блоки       , "Коллекция", Параметры);
-        
-    URL = "https://slack.com/api/chat.postEphemeral";
-        
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Изменить сообщение
-// Изменяет состав существующего сообщения
-// 
-// Параметры:
-//  Токен        - Строка - Токен бота                          - token
-//  Канал        - Строка - Идентификатор канала                - channel
-//  Отметка      - Строка - Временная отметка сообщения         - stamp
-//  Текст        - Строка - Новый текст сообщения               - text
-//  МассивБлоков - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ИзменитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Текст = "", Знач МассивБлоков = "") Экспорт
-    
-    Строка_   = "Строка";
-    URL       = "https://slack.com/api/chat.update";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал       , Строка_    , Параметры);
-    OPI_Инструменты.ДобавитьПоле("text"   , Текст       , Строка_    , Параметры);
-    OPI_Инструменты.ДобавитьПоле("ts"     , Отметка     , Строка_    , Параметры);
-    OPI_Инструменты.ДобавитьПоле("blocks" , МассивБлоков, "Коллекция", Параметры);
-        
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить сообщение
-// Удаляет сообщение канала по timestamp
-// 
-// Параметры:
-//  Токен         - Строка - Токен бота                             - token
-//  Канал         - Строка - Идентификатор канала                   - channel
-//  Отметка       - Строка - Временная отметка или ID сообщения     - stamp
-//  ЭтоОтложенное - Булево - Признак удаления отложенного сообщения - issheduled
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач ЭтоОтложенное = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоОтложенное);
-    
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-        
-    Если ЭтоОтложенное Тогда
-        URL         = "https://slack.com/api/chat.deleteScheduledMessage";
-        ПолеОтметки = "scheduled_message_id";       
-    Иначе
-        URL         = "https://slack.com/api/chat.delete";
-        ПолеОтметки = "ts";
-    КонецЕсли;
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel"  , Канал  , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле(ПолеОтметки, Отметка, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить список отложенных сообщений
-// Получает список отложенных сообщений канала
-// 
-// Параметры:
-//  Токен  - Строка - Токен бота                                                    - token
-//  Канал  - Строка - Идентификатор канала                                          - channel
-//  Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокОтложенныхСообщений(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт
-    
-    URL       = "https://slack.com/api/chat.scheduledMessages.list";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-   
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить ссылку на сообщение
-// Получает постоянный UTL к сообщению канала
-// 
-// Параметры:
-//  Токен         - Строка - Токен бота                             - token
-//  Канал         - Строка - Идентификатор канала                   - channel
-//  Отметка       - Строка - Временная отметка или ID сообщения     - stamp
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСсылкуНаСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт
-    
-    URL       = "https://slack.com/api/chat.getPermalink";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel"   , Канал  , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("message_ts", Отметка, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить список ответов на сообщение
-// Получает массив сообщений, которые являются ответом на указанное
-// 
-// Параметры:
-//  Токен         - Строка - Токен бота                                                    - token
-//  Канал         - Строка - Идентификатор канала                                          - channel
-//  Отметка       - Строка - Временная отметка или ID сообщения                            - stamp
-//  Курсор        - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокОтветовНаСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Курсор = "") Экспорт
-    
-    Строка_   = "Строка";
-    URL       = "https://slack.com/api/conversations.replies";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-   
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал  , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("ts"     , Отметка, Строка_, Параметры);
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСКаналами
-
-// Получить список каналов
-// Получает список доступных каналов
-// 
-// Параметры:
-//  Токен                   - Строка - Токен бота                                                    - token
-//  ИсключатьАрхивированные - Булево - Признак исключения архивированных каналов                     - notarchived 
-//  Курсор                  - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокКаналов(Знач Токен, Знач ИсключатьАрхивированные = Ложь, Знач Курсор = "") Экспорт
-    
-    URL       = "https://slack.com/api/conversations.list";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("exclude_archived", ИсключатьАрхивированные, "Булево", Параметры);
-    OPI_Инструменты.ДобавитьПоле("cursor"          , Курсор                 , "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить список пользователей канала
-// Получает список пользователей указанного канала
-// 
-// Параметры:
-//  Токен         - Строка - Токен бота                                                    - token
-//  Канал         - Строка - Идентификатор канала                                          - channel
-//  Курсор        - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокПользователейКанала(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт
-    
-    URL       = "https://slack.com/api/conversations.members";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Создать канал
-// Создает новый канал
-// 
-// Параметры:
-//  Токен     - Строка - Токен бота              - token
-//  Название  - Строка - Наименование канала     - title
-//  Приватный - Булево - Создать канал приватным - private
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция СоздатьКанал(Знач Токен, Знач Название, Знач Приватный = Ложь) Экспорт
-    
-    URL       = "https://slack.com/api/conversations.create";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("name"      , Название , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("is_private", Приватный, "Булево", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-     
-КонецФункции
-
-// Архивировать канал
-// Архивирует активный канал
-// 
-// Параметры:
-//  Токен - Строка - Токен бота - token
-//  Канал - Строка - ID канала  - channel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция АрхивироватьКанал(Знач Токен, Знач Канал) Экспорт
-    
-    URL   = "https://slack.com/api/conversations.archive";
-    Ответ = УправлениеДиалогом(Токен, Канал, URL);
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить канал
-// Получает информацию о канале
-// 
-// Параметры:
-//  Токен - Строка - Токен бота - token
-//  Канал - Строка - ID канала  - channel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьКанал(Знач Токен, Знач Канал) Экспорт
-    
-    URL   = "https://slack.com/api/conversations.info";
-    Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET");
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить историю канала
-// Получает информацию событиях канала
-// 
-// Параметры:
-//  Токен - Строка - Токен бота - token
-//  Канал - Строка - ID канала  - channel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьИсториюКанала(Знач Токен, Знач Канал) Экспорт
-    
-    URL   = "https://slack.com/api/conversations.history";
-    Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET");
-    Возврат Ответ;
-
-КонецФункции
-
-// Пригласить пользователей в канал
-// Добавляет указанных пользователей в канал
-// 
-// Параметры:
-//  Токен               - Строка           - Токен бота              - token
-//  Канал               - Строка           - ID канала               - channel
-//  МассивПользователей - Массив Из Строка - Массив ID пользователей - users
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПригласитьПользователейВКанал(Знач Токен, Знач Канал, Знач МассивПользователей) Экспорт
-    
-    URL       = "https://slack.com/api/conversations.invite";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей);
-    МассивПользователей = СтрСоединить(МассивПользователей, ",");
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал              , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("users"  , МассивПользователей, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Выгнать пользователя из канала
-// Удаляет указанного пользователя из канала
-// 
-// Параметры:
-//  Токен        - Строка - Токен бота      - token
-//  Канал        - Строка - ID канала       - channel
-//  Пользователь - Строка - ID пользователя - user
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ВыгнатьПользователяИзКанала(Знач Токен, Знач Канал, Знач Пользователь) Экспорт
-    
-    URL       = "https://slack.com/api/conversations.kick";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-        
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал       , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("user"   , Пользователь, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Вступить в канал
-// Добавляет текущего бота в канал
-// 
-// Параметры:
-//  Токен - Строка - Токен бота - token
-//  Канал - Строка - ID канала  - channel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ВступитьВКанал(Знач Токен, Знач Канал) Экспорт
-    
-    URL   = "https://slack.com/api/conversations.join";
-    Ответ = УправлениеДиалогом(Токен, Канал, URL);
-    Возврат Ответ;
-
-КонецФункции
-
-// Покинуть канал
-// Удаляет текущего бота из канала
-// 
-// Параметры:
-//  Токен - Строка - Токен бота - token
-//  Канал - Строка - ID канала  - channel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПокинутьКанал(Знач Токен, Знач Канал) Экспорт
-    
-    URL   = "https://slack.com/api/conversations.leave";
-    Ответ = УправлениеДиалогом(Токен, Канал, URL);
-    Возврат Ответ;
-
-КонецФункции
-
-// Установить тему канала
-// Устанавливает тему канала
-// 
-// Параметры:
-//  Токен - Строка - Токен бота  - token
-//  Канал - Строка - ID канала   - channel
-//  Тема  - Строка - Тема канала - theme
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УстановитьТемуКанала(Знач Токен, Знач Канал, Знач Тема) Экспорт
-    
-    URL       = "https://slack.com/api/conversations.setTopic";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("topic"  , Тема  , "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Установить цель канала
-// Устанавливает цель (описание) канала
-// 
-// Параметры:
-//  Токен - Строка - Токен бота  - token
-//  Канал - Строка - ID канала   - channel
-//  Цель  - Строка - Цель канала - purpose
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УстановитьЦельКанала(Знач Токен, Знач Канал, Знач Цель) Экспорт
-    
-    URL       = "https://slack.com/api/conversations.setPurpose";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("purpose", Цель  , "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Переименовать канал
-// Изменяет название канала
-// 
-// Параметры:
-//  Токен     - Строка - Токен бота            - token
-//  Канал     - Строка - ID канала             - channel
-//  Название  - Строка - Новое название канала - title
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПереименоватьКанал(Знач Токен, Знач Канал, Знач Название) Экспорт
-    
-    URL       = "https://slack.com/api/conversations.rename";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал   , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("name"   , Название, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСДиалогами
-
-// Открыть диалог
-// Открывает новый диалог с одним или несколькими пользователями
-// 
-// Параметры:
-//  Токен               - Строка           - Токен бота              - token
-//  МассивПользователей - Массив из Строка - Массив ID пользователей - users
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ОткрытьДиалог(Знач Токен, Знач МассивПользователей) Экспорт
-    
-    URL       = "https://slack.com/api/conversations.open";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей);
-    МассивПользователей = СтрСоединить(МассивПользователей, ",");
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("users", МассивПользователей, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Закрыть диалог
-// Закрывает существующий диалог
-// 
-// Параметры:
-//  Токен  - Строка - Токен бота - token
-//  Диалог - Строка - ID диалога - conv
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ЗакрытьДиалог(Знач Токен, Знач Диалог) Экспорт
-    
-    URL   = "https://slack.com/api/conversations.close";
-    Ответ = УправлениеДиалогом(Токен, Диалог, URL);
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСФайлами
-
-// Получить список файлов
-// Получает список файлов бота или канала
-// 
-// Параметры:
-//  Токен          - Строка        - Токен бота       - token
-//  Канал          - Строка        - Канал для отбора - channel 
-//  НомерСтраницы  - Число, Строка - Номер страницы   - page
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт
-    
-    URL       = "https://slack.com/api/files.list";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал        , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("page"   , НомерСтраницы, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Загрузить файл
-// Загружает файл на сервера Slack
-// 
-// Параметры:
-//  Токен     - Строка                - Токен бота              - token
-//  Файл      - Строка,ДвоичныеДанные - Файл для загрузки       - file
-//  ИмяФайла  - Строка                - Имя файла с расширением - filename
-//  Заголовок - Строка                - Имя файла в Slack       - title
-//  Канал     - Строка                - ID канала               - channel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-    
-    Строка_    = "Строка";
-    Upload_url = "upload_url";
-    File_id    = "file_id";
-    URL        = "https://slack.com/api/files.getUploadURLExternal";
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-    Размер     = Файл.Размер();
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("length"  , Размер  , Строка_, Параметры);
-
-    Ответ         = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    URL           = Ответ[Upload_url];
-    Идентификатор = Ответ[File_id];
-    
-    Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда
-        Возврат Ответ;
-    КонецЕсли;
-    
-    Файлы = Новый Соответствие;
-    Файлы.Вставить(ИмяФайла, Файл);
-    
-    Ответ     = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки);
-    URL       = "https://slack.com/api/files.completeUploadExternal"; 
-    ФайлСлак  = Новый Структура("id, title", Идентификатор, Заголовок);   
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("filename"  , ИмяФайла, Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("channel_id", Канал   , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("files"     , ФайлСлак, "Массив", Параметры);
-
-    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить данные файла
-// Получает информацию о файле
-// 
-// Параметры:
-//  Токен              - Строка - Токен бота          - token
-//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт
-    
-    URL   = "https://slack.com/api/files.info";
-    Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET");
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить файл
-// Удаляет файл на Slack
-// 
-// Параметры:
-//  Токен              - Строка - Токен бота          - token
-//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
-    
-    URL   = "https://slack.com/api/files.delete";
-    Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
-    
-    Возврат Ответ;
-  
-КонецФункции
-
-// Сделать файл публичным
-// Создает публичный URL для файла. Требует токен пользователя
-// 
-// Параметры:
-//  Токен              - Строка - Токен пользователя  - token
-//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт
-    
-    URL   = "https://slack.com/api/files.sharedPublicURL";
-    Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
-    
-    Возврат Ответ;
-  
-КонецФункции
-
-// Сделать файл приватным
-// Удаляет публичный URL у файла. Требует токен пользователя
-// 
-// Параметры:
-//  Токен              - Строка - Токен пользователя  - token
-//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт
-    
-    URL   = "https://slack.com/api/files.revokePublicURL";
-    Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
-    
-    Возврат Ответ;
-  
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСУдаленнымиФайлами
-
-// Получить список внешних файлов
-// Получает список внешних файлов пользователя или канала
-// 
-// Параметры:
-//  Токен  - Строка - Токен бота                                                    - token
-//  Канал  - Строка - Канал для отбора                                              - channel 
-//  Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокВнешнихФайлов(Знач Токен, Знач Канал = "", Знач Курсор = "") Экспорт
-    
-    URL       = "https://slack.com/api/files.remote.list";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить внешний файл
-// Получает информацию о внешнем файле
-// 
-// Параметры:
-//  Токен              - Строка - Токен бота          - token
-//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
-  
-    URL   = "https://slack.com/api/files.remote.info";
-    Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL);
-    
-    Возврат Ответ;
-      
-КонецФункции
-
-// Добавить внешний файл
-// Добавляет новый внешний файл
-// 
-// Параметры:
-//  Токен     - Строка - Токен бота                - token
-//  URL       - Строка - URL к внешнему файлу      - url
-//  Заголовок - Строка - Заголовок файла для Slack - title
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт
-    
-    Строка_   = "Строка";
-    URL       = "https://slack.com/api/files.remote.add";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    UID       = Строка(Новый УникальныйИдентификатор());
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("external_url", URL          , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("external_id" , UID          , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("title"       , Заголовок    , Строка_, Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Отправить внешний файл
-// Отправляет внейшний файл по списку каналов
-// 
-// Параметры:
-//  Токен              - Строка           - Токен бота                  - token
-//  ИдентификаторФайла - Строка           - Идентификатор файла         - fileid
-//  МассивКаналов      - Массив Из Строка - Массив каналов для отправки - channels
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ОтправитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла, Знач МассивКаналов) Экспорт
-    
-    URL       = "https://slack.com/api/files.remote.share";
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКаналов);
-    МассивКаналов = СтрСоединить(МассивКаналов, ",");
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("file"    , ИдентификаторФайла , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("channels", МассивКаналов      , "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить внешний файл
-// Удаляет внешний файл из Slack
-// 
-// Параметры:
-//  Токен              - Строка - Токен бота          - token
-//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УдалитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
-  
-    URL   = "https://slack.com/api/files.remote.remove";
-    Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL);
-    
-    Возврат Ответ;
-      
-КонецФункции
-
-#КонецОбласти
-
-#Область ФормированиеБлоков
-
-// Сформировать блок картинку
-// Формирует блок с картинкой для добавления в массив блоков сообщения
-// 
-// Параметры:
-//  URL                 - Строка - URL картинки                   - picture
-//  АльтернативныйТекст - Строка - Альтернативный текст картинки  - alt
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение -  Блок картинки
-Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт
-    
-    Строка_ = "Строка";
-    
-    Блок = Новый Соответствие;
-    OPI_Инструменты.ДобавитьПоле("type"     , "image"              , Строка_, Блок);
-    OPI_Инструменты.ДобавитьПоле("image_url", URL                  , Строка_, Блок);
-    OPI_Инструменты.ДобавитьПоле("alt_text" , АльтернативныйТекст  , Строка_, Блок);
-    
-    Возврат Блок;
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьЗаголовокАвторизации(Знач Токен)
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Заголовки = Новый Соответствие;
-    Заголовки.Вставить("Authorization", "Bearer " + Токен);
-    Возврат Заголовки;
-        
-КонецФункции
-
-Функция УправлениеДиалогом(Знач Токен, Знач Канал, Знач URL, Знач ВидЗапроса = "POST")
-    
-    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
-    ВидЗапроса = вРег(ВидЗапроса);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры);
-
-    Если ВидЗапроса = "POST" Тогда
-        Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    Иначе
-        Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    КонецЕсли;
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST")
-    
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    ВидЗапроса = вРег(ВидЗапроса);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
-
-    Если ВидЗапроса = "POST" Тогда
-        Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-    Иначе
-        Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    КонецЕсли;
-
-    Возврат Ответ;
-
-КонецФункции
-
-Функция ПолучениеОбщихДанных(Знач Токен, Знач URL, Знач Курсор)
-    
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры);
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция УправлениеВнешнимФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL)
-    
-    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Slack.os
+// Библиотека: Slack
+// Команда CLI: slack
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:Typo-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область УправлениеИНастройки
+
+// Получить информацию о боте
+// Получает основную информацию о боте
+// 
+// Параметры:
+//  Токен - Строка - Токен бота - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack 
+Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт
+    
+    URL       = "https://slack.com/api/auth.test";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить список рабочих областей
+// Получает список рабочих областей, в которых подключен бот
+// 
+// Параметры:
+//  Токен  - Строка - Токен бота                                                    - token
+//  Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокРабочихОбластей(Знач Токен, Знач Курсор = "") Экспорт
+    
+    URL   = "https://slack.com/api/auth.teams.list";
+    Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить список пользователей
+// Получает список пользователей рабочей области
+// 
+// Параметры:
+//  Токен  - Строка - Токен бота                                                    - token
+//  Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокПользователей(Знач Токен, Знач Курсор = "") Экспорт
+    
+    URL   = "https://slack.com/api/users.list";
+    Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаССообщениями
+
+// Отправить сообщение
+// Отправляет сообщение в выбранный час
+// 
+// Параметры:
+//  Токен        - Строка - Токен бота                              - token
+//  Канал        - Строка - Идентификатор канала                    - channel
+//  Текст        - Строка - Текст сообщения                         - text
+//  ДатаОтправки - Дата   - Дата отправки для отложенного сообщения - date 
+//  Блоки        - Массив Из Структура - Массив описаний блоков     - blocks - JSON массива описаний блоков
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст = "", Знач ДатаОтправки = "", Знач Блоки = "") Экспорт
+      
+    Строка_   = "Строка";
+    ЕстьДата  = ЗначениеЗаполнено(ДатаОтправки); 
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Если ЗначениеЗаполнено(Блоки) И ТипЗнч(Блоки) = Тип(Строка_) Тогда
+        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки);
+        
+        Если ТипЗнч(Блоки) = Тип("Массив") Тогда
+            
+            Для Н = 0 По Блоки.ВГраница() Цикл
+                OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки[Н]);                    
+            КонецЦикла;
+            
+        КонецЕсли;
+
+    КонецЕсли;
+        
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал, Строка_    , Параметры);
+    OPI_Инструменты.ДобавитьПоле("text"   , Текст, Строка_    , Параметры);
+    OPI_Инструменты.ДобавитьПоле("blocks" , Блоки, "Массив"   , Параметры);
+
+    Если ЕстьДата Тогда
+        
+        URL      = "https://slack.com/api/chat.scheduleMessage";
+        OPI_Инструменты.ДобавитьПоле("post_at", ДатаОтправки, "Дата", Параметры); 
+        
+    Иначе
+        
+        URL = "https://slack.com/api/chat.postMessage";
+        
+    КонецЕсли;
+          
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Отправить эфемерное сообщение
+// Отправляет сообщение, которое приходит в канал, но видно 
+// только конкретному пользователю
+// 
+// Параметры:
+//  Токен        - Строка - Токен бота                              - token
+//  Канал        - Строка - Идентификатор канала                    - channel
+//  Текст        - Строка - Текст сообщения                         - text
+//  Пользователь - Строка - ID пользователя                         - user 
+//  Блоки        - Массив Из Структура - Массив описаний блоков     - blocks - JSON массива описаний блоков
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ОтправитьЭфемерноеСообщение(Знач Токен
+    , Знач Канал
+    , Знач Текст = ""
+    , Знач Пользователь = ""
+    , Знач Блоки = "") Экспорт
+    
+    Строка_ = "Строка";
+    
+    Если ЗначениеЗаполнено(Блоки) И Не ТипЗнч(Блоки) = Тип(Строка_) Тогда
+        OPI_ПреобразованиеТипов.ПолучитьМассив(Блоки);
+    КонецЕсли;
+    
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал       , Строка_    , Параметры);
+    OPI_Инструменты.ДобавитьПоле("text"   , Текст       , Строка_    , Параметры);
+    OPI_Инструменты.ДобавитьПоле("user"   , Пользователь, Строка_    , Параметры);
+    OPI_Инструменты.ДобавитьПоле("blocks" , Блоки       , "Коллекция", Параметры);
+        
+    URL = "https://slack.com/api/chat.postEphemeral";
+        
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Изменить сообщение
+// Изменяет состав существующего сообщения
+// 
+// Параметры:
+//  Токен        - Строка - Токен бота                          - token
+//  Канал        - Строка - Идентификатор канала                - channel
+//  Отметка      - Строка - Временная отметка сообщения         - stamp
+//  Текст        - Строка - Новый текст сообщения               - text
+//  МассивБлоков - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ИзменитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Текст = "", Знач МассивБлоков = "") Экспорт
+    
+    Строка_   = "Строка";
+    URL       = "https://slack.com/api/chat.update";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал       , Строка_    , Параметры);
+    OPI_Инструменты.ДобавитьПоле("text"   , Текст       , Строка_    , Параметры);
+    OPI_Инструменты.ДобавитьПоле("ts"     , Отметка     , Строка_    , Параметры);
+    OPI_Инструменты.ДобавитьПоле("blocks" , МассивБлоков, "Коллекция", Параметры);
+        
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить сообщение
+// Удаляет сообщение канала по timestamp
+// 
+// Параметры:
+//  Токен         - Строка - Токен бота                             - token
+//  Канал         - Строка - Идентификатор канала                   - channel
+//  Отметка       - Строка - Временная отметка или ID сообщения     - stamp
+//  ЭтоОтложенное - Булево - Признак удаления отложенного сообщения - issheduled
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач ЭтоОтложенное = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоОтложенное);
+    
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+        
+    Если ЭтоОтложенное Тогда
+        URL         = "https://slack.com/api/chat.deleteScheduledMessage";
+        ПолеОтметки = "scheduled_message_id";       
+    Иначе
+        URL         = "https://slack.com/api/chat.delete";
+        ПолеОтметки = "ts";
+    КонецЕсли;
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel"  , Канал  , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле(ПолеОтметки, Отметка, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить список отложенных сообщений
+// Получает список отложенных сообщений канала
+// 
+// Параметры:
+//  Токен  - Строка - Токен бота                                                    - token
+//  Канал  - Строка - Идентификатор канала                                          - channel
+//  Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокОтложенныхСообщений(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт
+    
+    URL       = "https://slack.com/api/chat.scheduledMessages.list";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+   
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить ссылку на сообщение
+// Получает постоянный UTL к сообщению канала
+// 
+// Параметры:
+//  Токен         - Строка - Токен бота                             - token
+//  Канал         - Строка - Идентификатор канала                   - channel
+//  Отметка       - Строка - Временная отметка или ID сообщения     - stamp
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСсылкуНаСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт
+    
+    URL       = "https://slack.com/api/chat.getPermalink";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel"   , Канал  , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("message_ts", Отметка, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить список ответов на сообщение
+// Получает массив сообщений, которые являются ответом на указанное
+// 
+// Параметры:
+//  Токен         - Строка - Токен бота                                                    - token
+//  Канал         - Строка - Идентификатор канала                                          - channel
+//  Отметка       - Строка - Временная отметка или ID сообщения                            - stamp
+//  Курсор        - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокОтветовНаСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Курсор = "") Экспорт
+    
+    Строка_   = "Строка";
+    URL       = "https://slack.com/api/conversations.replies";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+   
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал  , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("ts"     , Отметка, Строка_, Параметры);
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСКаналами
+
+// Получить список каналов
+// Получает список доступных каналов
+// 
+// Параметры:
+//  Токен                   - Строка - Токен бота                                                    - token
+//  ИсключатьАрхивированные - Булево - Признак исключения архивированных каналов                     - notarchived 
+//  Курсор                  - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокКаналов(Знач Токен, Знач ИсключатьАрхивированные = Ложь, Знач Курсор = "") Экспорт
+    
+    URL       = "https://slack.com/api/conversations.list";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("exclude_archived", ИсключатьАрхивированные, "Булево", Параметры);
+    OPI_Инструменты.ДобавитьПоле("cursor"          , Курсор                 , "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить список пользователей канала
+// Получает список пользователей указанного канала
+// 
+// Параметры:
+//  Токен         - Строка - Токен бота                                                    - token
+//  Канал         - Строка - Идентификатор канала                                          - channel
+//  Курсор        - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокПользователейКанала(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт
+    
+    URL       = "https://slack.com/api/conversations.members";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Создать канал
+// Создает новый канал
+// 
+// Параметры:
+//  Токен     - Строка - Токен бота              - token
+//  Название  - Строка - Наименование канала     - title
+//  Приватный - Булево - Создать канал приватным - private
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция СоздатьКанал(Знач Токен, Знач Название, Знач Приватный = Ложь) Экспорт
+    
+    URL       = "https://slack.com/api/conversations.create";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("name"      , Название , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("is_private", Приватный, "Булево", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+     
+КонецФункции
+
+// Архивировать канал
+// Архивирует активный канал
+// 
+// Параметры:
+//  Токен - Строка - Токен бота - token
+//  Канал - Строка - ID канала  - channel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция АрхивироватьКанал(Знач Токен, Знач Канал) Экспорт
+    
+    URL   = "https://slack.com/api/conversations.archive";
+    Ответ = УправлениеДиалогом(Токен, Канал, URL);
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить канал
+// Получает информацию о канале
+// 
+// Параметры:
+//  Токен - Строка - Токен бота - token
+//  Канал - Строка - ID канала  - channel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьКанал(Знач Токен, Знач Канал) Экспорт
+    
+    URL   = "https://slack.com/api/conversations.info";
+    Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET");
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить историю канала
+// Получает информацию событиях канала
+// 
+// Параметры:
+//  Токен - Строка - Токен бота - token
+//  Канал - Строка - ID канала  - channel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьИсториюКанала(Знач Токен, Знач Канал) Экспорт
+    
+    URL   = "https://slack.com/api/conversations.history";
+    Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET");
+    Возврат Ответ;
+
+КонецФункции
+
+// Пригласить пользователей в канал
+// Добавляет указанных пользователей в канал
+// 
+// Параметры:
+//  Токен               - Строка           - Токен бота              - token
+//  Канал               - Строка           - ID канала               - channel
+//  МассивПользователей - Массив Из Строка - Массив ID пользователей - users
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПригласитьПользователейВКанал(Знач Токен, Знач Канал, Знач МассивПользователей) Экспорт
+    
+    URL       = "https://slack.com/api/conversations.invite";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей);
+    МассивПользователей = СтрСоединить(МассивПользователей, ",");
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал              , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("users"  , МассивПользователей, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Выгнать пользователя из канала
+// Удаляет указанного пользователя из канала
+// 
+// Параметры:
+//  Токен        - Строка - Токен бота      - token
+//  Канал        - Строка - ID канала       - channel
+//  Пользователь - Строка - ID пользователя - user
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ВыгнатьПользователяИзКанала(Знач Токен, Знач Канал, Знач Пользователь) Экспорт
+    
+    URL       = "https://slack.com/api/conversations.kick";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+        
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал       , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("user"   , Пользователь, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Вступить в канал
+// Добавляет текущего бота в канал
+// 
+// Параметры:
+//  Токен - Строка - Токен бота - token
+//  Канал - Строка - ID канала  - channel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ВступитьВКанал(Знач Токен, Знач Канал) Экспорт
+    
+    URL   = "https://slack.com/api/conversations.join";
+    Ответ = УправлениеДиалогом(Токен, Канал, URL);
+    Возврат Ответ;
+
+КонецФункции
+
+// Покинуть канал
+// Удаляет текущего бота из канала
+// 
+// Параметры:
+//  Токен - Строка - Токен бота - token
+//  Канал - Строка - ID канала  - channel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПокинутьКанал(Знач Токен, Знач Канал) Экспорт
+    
+    URL   = "https://slack.com/api/conversations.leave";
+    Ответ = УправлениеДиалогом(Токен, Канал, URL);
+    Возврат Ответ;
+
+КонецФункции
+
+// Установить тему канала
+// Устанавливает тему канала
+// 
+// Параметры:
+//  Токен - Строка - Токен бота  - token
+//  Канал - Строка - ID канала   - channel
+//  Тема  - Строка - Тема канала - theme
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УстановитьТемуКанала(Знач Токен, Знач Канал, Знач Тема) Экспорт
+    
+    URL       = "https://slack.com/api/conversations.setTopic";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("topic"  , Тема  , "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Установить цель канала
+// Устанавливает цель (описание) канала
+// 
+// Параметры:
+//  Токен - Строка - Токен бота  - token
+//  Канал - Строка - ID канала   - channel
+//  Цель  - Строка - Цель канала - purpose
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УстановитьЦельКанала(Знач Токен, Знач Канал, Знач Цель) Экспорт
+    
+    URL       = "https://slack.com/api/conversations.setPurpose";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("purpose", Цель  , "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Переименовать канал
+// Изменяет название канала
+// 
+// Параметры:
+//  Токен     - Строка - Токен бота            - token
+//  Канал     - Строка - ID канала             - channel
+//  Название  - Строка - Новое название канала - title
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПереименоватьКанал(Знач Токен, Знач Канал, Знач Название) Экспорт
+    
+    URL       = "https://slack.com/api/conversations.rename";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал   , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("name"   , Название, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСДиалогами
+
+// Открыть диалог
+// Открывает новый диалог с одним или несколькими пользователями
+// 
+// Параметры:
+//  Токен               - Строка           - Токен бота              - token
+//  МассивПользователей - Массив из Строка - Массив ID пользователей - users
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ОткрытьДиалог(Знач Токен, Знач МассивПользователей) Экспорт
+    
+    URL       = "https://slack.com/api/conversations.open";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей);
+    МассивПользователей = СтрСоединить(МассивПользователей, ",");
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("users", МассивПользователей, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Закрыть диалог
+// Закрывает существующий диалог
+// 
+// Параметры:
+//  Токен  - Строка - Токен бота - token
+//  Диалог - Строка - ID диалога - conv
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ЗакрытьДиалог(Знач Токен, Знач Диалог) Экспорт
+    
+    URL   = "https://slack.com/api/conversations.close";
+    Ответ = УправлениеДиалогом(Токен, Диалог, URL);
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСФайлами
+
+// Получить список файлов
+// Получает список файлов бота или канала
+// 
+// Параметры:
+//  Токен          - Строка        - Токен бота       - token
+//  Канал          - Строка        - Канал для отбора - channel 
+//  НомерСтраницы  - Число, Строка - Номер страницы   - page
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт
+    
+    URL       = "https://slack.com/api/files.list";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал        , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("page"   , НомерСтраницы, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Загрузить файл
+// Загружает файл на сервера Slack
+// 
+// Параметры:
+//  Токен     - Строка                - Токен бота              - token
+//  Файл      - Строка,ДвоичныеДанные - Файл для загрузки       - file
+//  ИмяФайла  - Строка                - Имя файла с расширением - filename
+//  Заголовок - Строка                - Имя файла в Slack       - title
+//  Канал     - Строка                - ID канала               - channel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+    
+    Строка_    = "Строка";
+    Upload_url = "upload_url";
+    File_id    = "file_id";
+    URL        = "https://slack.com/api/files.getUploadURLExternal";
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+    Размер     = Файл.Размер();
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("length"  , Размер  , Строка_, Параметры);
+
+    Ответ         = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    URL           = Ответ[Upload_url];
+    Идентификатор = Ответ[File_id];
+    
+    Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда
+        Возврат Ответ;
+    КонецЕсли;
+    
+    Файлы = Новый Соответствие;
+    Файлы.Вставить(ИмяФайла, Файл);
+    
+    Ответ     = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки);
+    URL       = "https://slack.com/api/files.completeUploadExternal"; 
+    ФайлСлак  = Новый Структура("id, title", Идентификатор, Заголовок);   
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("filename"  , ИмяФайла, Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("channel_id", Канал   , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("files"     , ФайлСлак, "Массив", Параметры);
+
+    Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить данные файла
+// Получает информацию о файле
+// 
+// Параметры:
+//  Токен              - Строка - Токен бота          - token
+//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт
+    
+    URL   = "https://slack.com/api/files.info";
+    Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET");
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить файл
+// Удаляет файл на Slack
+// 
+// Параметры:
+//  Токен              - Строка - Токен бота          - token
+//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
+    
+    URL   = "https://slack.com/api/files.delete";
+    Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
+    
+    Возврат Ответ;
+  
+КонецФункции
+
+// Сделать файл публичным
+// Создает публичный URL для файла. Требует токен пользователя
+// 
+// Параметры:
+//  Токен              - Строка - Токен пользователя  - token
+//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт
+    
+    URL   = "https://slack.com/api/files.sharedPublicURL";
+    Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
+    
+    Возврат Ответ;
+  
+КонецФункции
+
+// Сделать файл приватным
+// Удаляет публичный URL у файла. Требует токен пользователя
+// 
+// Параметры:
+//  Токен              - Строка - Токен пользователя  - token
+//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт
+    
+    URL   = "https://slack.com/api/files.revokePublicURL";
+    Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
+    
+    Возврат Ответ;
+  
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСУдаленнымиФайлами
+
+// Получить список внешних файлов
+// Получает список внешних файлов пользователя или канала
+// 
+// Параметры:
+//  Токен  - Строка - Токен бота                                                    - token
+//  Канал  - Строка - Канал для отбора                                              - channel 
+//  Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокВнешнихФайлов(Знач Токен, Знач Канал = "", Знач Курсор = "") Экспорт
+    
+    URL       = "https://slack.com/api/files.remote.list";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить внешний файл
+// Получает информацию о внешнем файле
+// 
+// Параметры:
+//  Токен              - Строка - Токен бота          - token
+//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
+  
+    URL   = "https://slack.com/api/files.remote.info";
+    Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL);
+    
+    Возврат Ответ;
+      
+КонецФункции
+
+// Добавить внешний файл
+// Добавляет новый внешний файл
+// 
+// Параметры:
+//  Токен     - Строка - Токен бота                - token
+//  URL       - Строка - URL к внешнему файлу      - url
+//  Заголовок - Строка - Заголовок файла для Slack - title
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт
+    
+    Строка_   = "Строка";
+    URL       = "https://slack.com/api/files.remote.add";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    UID       = Строка(Новый УникальныйИдентификатор());
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("external_url", URL          , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("external_id" , UID          , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("title"       , Заголовок    , Строка_, Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Отправить внешний файл
+// Отправляет внейшний файл по списку каналов
+// 
+// Параметры:
+//  Токен              - Строка           - Токен бота                  - token
+//  ИдентификаторФайла - Строка           - Идентификатор файла         - fileid
+//  МассивКаналов      - Массив Из Строка - Массив каналов для отправки - channels
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ОтправитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла, Знач МассивКаналов) Экспорт
+    
+    URL       = "https://slack.com/api/files.remote.share";
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКаналов);
+    МассивКаналов = СтрСоединить(МассивКаналов, ",");
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("file"    , ИдентификаторФайла , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("channels", МассивКаналов      , "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить внешний файл
+// Удаляет внешний файл из Slack
+// 
+// Параметры:
+//  Токен              - Строка - Токен бота          - token
+//  ИдентификаторФайла - Строка - Идентификатор файла - fileid
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УдалитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
+  
+    URL   = "https://slack.com/api/files.remote.remove";
+    Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL);
+    
+    Возврат Ответ;
+      
+КонецФункции
+
+#КонецОбласти
+
+#Область ФормированиеБлоков
+
+// Сформировать блок картинку
+// Формирует блок с картинкой для добавления в массив блоков сообщения
+// 
+// Параметры:
+//  URL                 - Строка - URL картинки                   - picture
+//  АльтернативныйТекст - Строка - Альтернативный текст картинки  - alt
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение -  Блок картинки
+Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт
+    
+    Строка_ = "Строка";
+    
+    Блок = Новый Соответствие;
+    OPI_Инструменты.ДобавитьПоле("type"     , "image"              , Строка_, Блок);
+    OPI_Инструменты.ДобавитьПоле("image_url", URL                  , Строка_, Блок);
+    OPI_Инструменты.ДобавитьПоле("alt_text" , АльтернативныйТекст  , Строка_, Блок);
+    
+    Возврат Блок;
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьЗаголовокАвторизации(Знач Токен)
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Заголовки = Новый Соответствие;
+    Заголовки.Вставить("Authorization", "Bearer " + Токен);
+    Возврат Заголовки;
+        
+КонецФункции
+
+Функция УправлениеДиалогом(Знач Токен, Знач Канал, Знач URL, Знач ВидЗапроса = "POST")
+    
+    Заголовки  = ПолучитьЗаголовокАвторизации(Токен);
+    ВидЗапроса = вРег(ВидЗапроса);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры);
+
+    Если ВидЗапроса = "POST" Тогда
+        Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    Иначе
+        Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    КонецЕсли;
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST")
+    
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    ВидЗапроса = вРег(ВидЗапроса);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
+
+    Если ВидЗапроса = "POST" Тогда
+        Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+    Иначе
+        Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    КонецЕсли;
+
+    Возврат Ответ;
+
+КонецФункции
+
+Функция ПолучениеОбщихДанных(Знач Токен, Знач URL, Знач Курсор)
+    
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры);
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция УправлениеВнешнимФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL)
+    
+    Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Telegram.os b/src/ru/OInt/core/Modules/OPI_Telegram.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_Telegram.os
rename to src/ru/OInt/core/Modules/OPI_Telegram.os
index 0fd95001d1..0b368450ed 100644
--- a/ru/OInt/core/Modules/OPI_Telegram.os
+++ b/src/ru/OInt/core/Modules/OPI_Telegram.os
@@ -1,1253 +1,1253 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Telegram.os
-// Библиотека: Telegram
-// Команда CLI: telegram
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:Typo-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UnreachableCode-off
-// BSLLS:CommentedCode-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область ПолучениеДанныхИНастройка
-
-// Получить информацию о боте
-// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д.
-// 
-// Параметры:
-//  Токен - Строка - Токен бота - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПолучитьИнформациюБота(Знач Токен) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL   = "api.telegram.org/bot" + Токен + "/getMe";
-    Ответ = OPI_Инструменты.Get(URL);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить обновления
-// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме
-//
-// Параметры:
-//  Токен    - Строка       - Токен бота                             - token
-//  Таймаут  - Строка,Число - Время ожидания новых событий           - timeout
-//  Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL   = "api.telegram.org/bot" + Токен + "/getUpdates";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры);
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-    Возврат Ответ;
-
-КонецФункции
-
-// Установить Webhook
-// Устанавливает URL обработчика событий бота для работы в режиме Webhook 
-//          
-// Параметры:
-//  Токен - Строка - Токен бота                                      - token
-//  URL   - Строка - Адрес обработки запросов от Telegram (с https:) - url
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры);
-
-    URL   = "api.telegram.org/bot" + Токен + "/setWebHook";
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Удалить Webhook
-// Удаляет URL обработчика событий бота для работы в режиме Webhook
-// 
-// Параметры:
-//  Токен - Строка - Токен бота - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция УдалитьWebhook(Знач Токен) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL   = "api.telegram.org/bot" + Токен + "/deleteWebHook";
-    Ответ = OPI_Инструменты.Get(URL);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Скачать файл
-// Скачивает файл с серверов Telegram
-// 
-// Параметры:
-//  Токен   - Строка - Токен                   - token
-//  IDФайла - Строка - ID файла для скачивания - fileid
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт
-
-    Result = "result";
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); 
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);    
-            
-    Параметры = Новый Структура("file_id", IDФайла);
-
-    URL   = "api.telegram.org/bot" + Токен + "/getFile";
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-    
-    Путь = Ответ[Result]["file_path"];
-    
-    Если Не ЗначениеЗаполнено(Путь) Тогда
-        Возврат Ответ;
-    КонецЕсли;
-    
-    URL   = "api.telegram.org/file/bot" + Токен + "/" + Путь;
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-    
-    Возврат Ответ;   
-    
-КонецФункции
-
-// ОбработатьДанные Telegram Mini App
-// Обрабатывает данные TMA и опредеяет их достоверность
-// 
-// Параметры:
-//  СтрокаДанных - Строка - querry из Telegram.WebApp.initData
-//  Токен        - Строка - Токен бота
-// 
-// Возвращаемое значение:
-//  Соответствие из Строка - Соответствие данных с результатом проверки в поле passed
-Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных);
-    
-    СтрокаДанных    = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
-    СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
-    Ключ            = "WebAppData";
-    Хэш             = "";
-    КлючДвоичные    = ПолучитьДвоичныеДанныеИзСтроки(Ключ);
-
-    Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен));
-
-    ТЗнач = Новый ТаблицаЗначений;
-    ТЗнач.Колонки.Добавить("Ключ");
-    ТЗнач.Колонки.Добавить("Значение");
-
-    Для Каждого Данные Из СтруктураДанных Цикл
-
-        НоваяСтрока             = ТЗнач.Добавить();
-        НоваяСтрока.Ключ        = Данные.Ключ;
-        НоваяСтрока.Значение    = Данные.Значение;
-
-    КонецЦикла;
-
-    ТЗнач.Сортировать("Ключ");
-
-    СоответствиеВозврата = Новый Соответствие;
-    DCS                  = "";
-
-    Для Каждого СтрокаТЗ Из ТЗнач Цикл
-
-        Если СтрокаТЗ.Ключ <> "hash" Тогда
-            DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
-            СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
-        Иначе
-            Хэш = СтрокаТЗ.Значение;
-        КонецЕсли;
-
-    КонецЦикла;
-
-    DCS     = Лев(DCS, СтрДлина(DCS) - 1);
-    Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
-
-    Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
-
-    Если Финал = вРег(Хэш) Тогда
-        Ответ = Истина;
-    Иначе
-        Ответ = Ложь;
-    КонецЕсли;
-
-    СоответствиеВозврата.Вставить("passed", Ответ);
-
-    Возврат СоответствиеВозврата;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область ОтправкаДанных
-
-// Отправить текстовое сообщение
-// Отправляет текстовое сообщение в чат или канал
-// 
-// Параметры:
-//  Токен      - Строка       - Токен бота                                        - token
-//  IDЧата     - Строка,Число - ID целевого чата или IDЧата*IDТемы                - chat
-//  Текст      - Строка       - Текст сообщения                                   - text
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//  Разметка   - Строка       - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьТекстовоеСообщение(Знач Токен
-	, Знач IDЧата
-	, Знач Текст
-	, Знач Клавиатура = ""
-	, Знач Разметка = "Markdown") Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);    
-    OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка);
-            
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , "Строка"     , Параметры);
-    OPI_Инструменты.ДобавитьПоле("text"        , Текст     , "Строка"     , Параметры);
-    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
-    
-    ДобавитьИдентификаторЧата(IDЧата, Параметры);
-    
-    URL   = "api.telegram.org/bot" + Токен + "/sendMessage";
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Отправить картинку
-// Отправляет картинку в чат или канал
-// 
-// Параметры:
-//  Токен      - Строка                - Токен бота                                - token
-//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
-//  Текст      - Строка                - Текст сообщения                           - text
-//  Картинка   - ДвоичныеДанные,Строка - Файл картинки                             - picture
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьКартинку(Знач Токен
-	, Знач IDЧата
-	, Знач Текст
-	, Знач Картинка
-	, Знач Клавиатура = ""
-	, Знач Разметка = "Markdown") Экспорт
-
-    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить видео
-// Отправляет видео в чат или канал
-// 
-// Параметры:
-//  Токен      - Строка                - Токен бота                                - token
-//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
-//  Текст      - Строка                - Текст сообщения                           - text
-//  Видео      - ДвоичныеДанные,Строка - Файл видео                                - video
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьВидео(Знач Токен
-	, Знач IDЧата
-	, Знач Текст
-	, Знач Видео
-	, Знач Клавиатура = ""
-	, Знач Разметка = "Markdown") Экспорт
-
-    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить аудио
-// Отправляет аудиофайл в чат или канал
-// 
-// Параметры:
-//  Токен      - Строка                - Токен бота                                - token
-//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
-//  Текст      - Строка                - Текст сообщения                           - text
-//  Аудио      - ДвоичныеДанные,Строка - Файл аудио                                - audio
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьАудио(Знач Токен
-	, Знач IDЧата
-	, Знач Текст
-	, Знач Аудио
-	, Знач Клавиатура = ""
-	, Знач Разметка = "Markdown") Экспорт
-
-    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить документ
-// Отправляет документ в чат или канал
-// 
-// Параметры:
-//  Токен      - Строка                - Токен бота                                - token
-//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
-//  Текст      - Строка                - Текст сообщения                           - text
-//  Документ   - ДвоичныеДанные,Строка - Файл документа                            - doc
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьДокумент(Знач Токен
-	, Знач IDЧата
-	, Знач Текст
-	, Знач Документ
-	, Знач Клавиатура = ""
-	, Знач Разметка = "Markdown") Экспорт
-
-    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить гифку
-// Отправляет гифку в чат или канал
-// 
-// Параметры:
-//  Токен      - Строка                - Токен бота                                - token
-//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
-//  Текст      - Строка                - Текст сообщения                           - text
-//  Гифка      - ДвоичныеДанные,Строка - Файл гифки                                - gif
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьГифку(Знач Токен
-	, Знач IDЧата
-	, Знач Текст
-	, Знач Гифка
-	, Знач Клавиатура = ""
-	, Знач Разметка = "Markdown") Экспорт
-
-    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить группу медиафайлов
-// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video
-// 
-// Параметры:
-//  Токен      - Строка                - Токен бота                                - token
-//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
-//  Текст      - Строка                - Текст сообщения                           - text
-//  СоответствиеФайлов - Соответствие из Строка - Коллекция файлов  - media - JSON файлов или путь к .json
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьМедиагруппу(Знач Токен
-	, Знач IDЧата
-	, Знач Текст
-	, Знач СоответствиеФайлов
-	, Знач Клавиатура = ""
-	, Знач Разметка = "Markdown") Экспорт
-    
-    // СоответствиеФайлов
-    // Ключ - Файл, Значение - Тип
-    // Типы: audio, document, photo, video
-    // Нельзя замешивать разные типы!
-
-	Строка_ = "Строка";
-	
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
-    
-    OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
-
-    URL             = "api.telegram.org/bot" + Токен + "/sendMediaGroup";
-    СтруктураФайлов = Новый Структура;
-    Медиа           = Новый Массив;
-    Параметры       = Новый Структура;
-    
-    ДобавитьИдентификаторЧата(IDЧата, Параметры);
-    СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа);
-    
-    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("caption"     , Текст     , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("media"       , Медиа     , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
-
-    Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Отправить местоположение
-// Отправляет местоположение по географической широте и долготе в чат или канал
-// 
-// Параметры:
-//  Токен      - Строка                - Токен бота                                - token
-//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
-//  Широта     - Строка,Число          - Географическая широта                     - lat
-//  Долгота    - Строка,Число          - Географическая долгота                    - long
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт
-
-	Строка_ = "Строка";
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
-    
-    URL = "api.telegram.org/bot" + Токен + "/sendLocation";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode"  , "Markdown" , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("latitude"    , Широта     , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("longitude"   , Долгота    , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры);
-    
-    ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Отправить контакт
-// Отправляет контакт с именем и номером телефона
-// 
-// Параметры:
-//  Токен      - Строка                - Токен бота                                - token
-//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
-//  Имя        - Строка                - Имя контакта                              - name
-//  Фамилия    - Строка                - Фамилия контакта                          - surname
-//  Телефон    - Строка                - Телефон контакта                          - phone
-//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт
-
-	Строка_ = "Строка";
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
-    
-    URL = "api.telegram.org/bot" + Токен + "/sendContact";
-
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode"  , "Markdown", Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("first_name"  , Имя       , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("last_name"   , Фамилия   , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("phone_number", Телефон   , Строка_      , Параметры);
-    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
-    
-    ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Отправить опрос
-// Отправляет опрос с вариантами ответа
-// 
-// Параметры:
-//  Токен         - Строка                - Токен бота                                 - token
-//  IDЧата        - Строка,Число          - ID целевого чата или IDЧата*IDТемы         - chat
-//  Вопрос        - Строка                - Вопрос опроса                              - question
-//  МассивОтветов - Массив из Строка      - Массив вариантов ответа                    - options
-//  Анонимный     - Булево                - Анонимность опроса                         - anonymous
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
-
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный);
-    
-    URL = "api.telegram.org/bot" + Токен + "/sendPoll";
-
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown"   , "Строка"     , Параметры);
-    OPI_Инструменты.ДобавитьПоле("question"  , Вопрос       , "Строка"     , Параметры);
-    OPI_Инструменты.ДобавитьПоле("options"   , МассивОтветов, "СтрокаФайла", Параметры);
-    
-    Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0));   
-    ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Переслать сообщение
-// Пересылает сообщение между чатами или в рамках одного чата
-// 
-// Параметры:
-//  Токен         - Строка       - Токен бота                         - token
-//  IDОригинала   - Строка,Число - ID оригинального сообщения         - message
-//  ОткудаID      - Строка,Число - ID чата оригинального сообщения    - from
-//  КудаID        - Строка,Число - ID целевого чата или IDЧата*IDТемы - to
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID);
-    
-    URL = "api.telegram.org/bot" + Токен + "/forwardMessage";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID   , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("message_id"  , IDОригинала, "Строка", Параметры);
-
-    ДобавитьИдентификаторЧата(КудаID, Параметры);
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Сформировать клавиатуру по массиву кнопок
-// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели
-// 
-// Параметры:
-//  МассивКнопок  - Массив из Строка - Массив кнопок                                        - buttons 
-//  ПодСообщением - Булево           - Клавиатура под сообщением или на нижней панели       - under
-//  ОднаПодОдной  - Булево           - Истина > кнопки выводятся в столбик, Ложь > в строку - column
-// 
-// Возвращаемое значение:
-//  Строка -  JSON клавиатуры
-Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок
-    , Знач ПодСообщением = Ложь
-    , Знач ОднаПодОдной = Истина) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
-    
-    Если ОднаПодОдной Тогда
-        Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
-    Иначе
-        Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок);
-    КонецЕсли;
-
-    Если ПодСообщением Тогда
-        СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
-    Иначе
-        СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина);
-    КонецЕсли;
-
-    Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра);
-
-    Возврат Клавиатура;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область Администрирование
-
-// Бан
-// Банит пользователя в выбранном чате
-// 
-// Параметры:
-//  Токен          - Строка       - Токен бота                         - token
-//  IDЧата         - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-//  IDПользователя - Строка,Число - ID целевого пользователя           - user
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
-
-	Строка_ = "Строка";
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL = "api.telegram.org/bot" + Токен + "/banChatMember";
-
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown"    , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата        , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("user_id"   , IDПользователя, Строка_, Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Разбан
-// Разбанивает забаненного ранее пользователя
-// 
-// Параметры:
-//  Токен          - Строка       - Токен бота                         - token
-//  IDЧата         - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-//  IDПользователя - Строка,Число - ID целевого пользователя           - user
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
-
-	Строка_ = "Строка";
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL = "api.telegram.org/bot" + Токен + "/unbanChatMember";
-
-    Параметры = Новый Структура;   
-    OPI_Инструменты.ДобавитьПоле("parse_mode"    , "Markdown"    , Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("chat_id"       , IDЧата        , Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("user_id"       , IDПользователя, Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь          , "Булево", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Создать ссылку-приглашение
-// Создает ссылку для вступления в закрытый чат
-// 
-// Параметры:
-//  Токен              - Строка         - Токен бота                                               - token
-//  IDЧата             - Строка,Число   - ID целевого чата или IDЧата*IDТемы                       - chat
-//  Заголовок          - Строка         - Заголовок приглашения                                    - title
-//  ДатаИстечения      - Дата           - Дата окончания жизни ссылки (безсрочно, если не указано) - expire
-//  ЛимитПользователей - Число          - Лимит пользователей (бесконечно, если не указано)        - limit
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция СоздатьСсылкуПриглашение(Знач Токен
-    , Знач IDЧата
-    , Знач Заголовок = ""
-    , Знач ДатаИстечения = ""
-    , Знач ЛимитПользователей = 0) Экспорт
-
-	Строка_ = "Строка";
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode"    , "Markdown"        , Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("chat_id"       , IDЧата            , Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("name"          , Заголовок         , Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("member_limit"  , ЛимитПользователей, Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("expire_date"   , ДатаИстечения     , "Дата"  , Параметры);
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Закрепить сообщение
-// Закрепляет сообщение в шапке чата
-// 
-// Параметры:
-//  Токен       - Строка       - Токен                 - token
-//  IDЧата      - Строка,Число - ID целевого чата      - chat
-//  IDСообщения - Строка,Число - ID целевого сообщения - message
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
-    
-    Строка_ = "Строка";
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL = "api.telegram.org/bot" + Токен + "/pinChatMessage";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode"          , "Markdown" , Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("chat_id"             , IDЧата     , Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("message_id"          , IDСообщения, Строка_ , Параметры);
-    OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь       , "Булево", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Открепить сообщение
-// Открепляет сообщение в шапке чата
-// 
-// Параметры:
-//  Токен       - Строка       - Токен бота            - token
-//  IDЧата      - Строка,Число - ID целевого чата      - chat
-//  IDСообщения - Строка,Число - ID целевого сообщения - message
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
-    
-    Строка_ = "Строка";
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить число участников
-// Получает общее число участников чата
-// 
-// Параметры:
-//  Токен  - Строка       - Токен бота       - token
-//  IDЧата - Строка,Число - ID целевого чата - chat
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , "Строка", Параметры);
-
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСТемамиФорума
-
-// Получить список иконок-аватаров
-// Получает соответствие ID Emoji для установки в качестве иконок тем форума
-// 
-// Параметры:
-//  Токен - Строка - Токен - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji
-Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Result    = "result";
-    URL       = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers";     
-    Ответ     = OPI_Инструменты.Get(URL);    
-    Иконки    = Ответ[Result];
-    
-    Если Не ЗначениеЗаполнено(Иконки) Тогда
-    	Возврат Ответ;
-    КонецЕсли; 
-    
-    Коллекция = Новый Соответствие;
-    
-    Для Каждого Иконка Из Иконки Цикл
-        Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]);
-    КонецЦикла;
-       
-    Возврат Коллекция;
-
-КонецФункции
-
-// Создать тему форума
-// Создает новую тему в группе с включенным функционалом тем
-// 
-// Параметры:
-//  Токен     - Строка       - Токен                            - token
-//  IDЧата    - Строка,Число - ID чата создания темы            - forum
-//  Заголовок - Строка       - Заголовок темы                   - title
-//  IDИконки  - Строка       - См. ПолучитьСписокИконокАватаров - icon
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт
-    Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки);
-КонецФункции
-
-// Изменить тему форума
-// Создает новую тему в группе с включенным функционалом тем
-// 
-// Параметры:
-//  Токен     - Строка       - Токен                            - token
-//  IDЧата    - Строка,Число - ID чата создания темы            - forum
-//  IDТемы    - Строка,Число - ID темы                          - topic
-//  Заголовок - Строка       - Новый заголовок                  - title
-//  IDИконки  - Строка       - См. ПолучитьСписокИконокАватаров - icon
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ИзменитьТемуФорума(Знач Токен
-    , Знач IDЧата
-    , Знач IDТемы
-    , Знач Заголовок = Неопределено
-    , Знач IDИконки = Неопределено) Экспорт   
-     
-    Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы);
-КонецФункции
-
-// Закрыть тему форума
-// Закрывает тему для новых сообщений
-// 
-// Параметры:
-//  Токен  - Строка       - Токен        - token
-//  IDЧата - Строка,Число - ID чата темы - forum
-//  IDТемы - Строка,Число - ID темы      - topic
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
-    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы);    
-КонецФункции
-
-// Открыть тему форума
-// Повторно открывает ранее закрытую тему форума
-// 
-// Параметры:
-//  Токен  - Строка       - Токен        - token
-//  IDЧата - Строка,Число - ID чата темы - forum
-//  IDТемы - Строка,Число - ID темы      - topic
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
-    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы);    
-КонецФункции
-
-// Удалить тему форума
-// Удаляет тему форума
-// 
-// Параметры:
-//  Токен  - Строка       - Токен        - token
-//  IDЧата - Строка,Число - ID чата темы - forum
-//  IDТемы - Строка,Число - ID темы      - topic
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт
-    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы);    
-КонецФункции
-
-// Скрыть главную тему форума
-// Скрывает главную тему форума
-// 
-// Параметры:
-//  Токен  - Строка       - Токен        - token
-//  IDЧата - Строка,Число - ID чата темы - forum
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
-    Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина);
-КонецФункции
-
-// Показать главную тему форума
-// Показывает ранее скрытую главную тему форума
-// 
-// Параметры:
-//  Токен  - Строка       - Токен        - token
-//  IDЧата - Строка,Число - ID чата темы - forum
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
-    Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь);
-КонецФункции
-
-// Изменить имя главной темы форума
-// Изменяет имя главной темы форума
-// 
-// Параметры:
-//  Токен     - Строка       - Токен                   - token
-//  IDЧата    - Строка,Число - ID чата темы            - forum
-//  Заголовок - Строка       - Новое имя главной темы  - title
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата   , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("name"   , Заголовок, "Строка", Параметры);
-    
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Очистить список закрепленных сообщений темы
-// Очищает список закрепленных сообщений в теме форума
-// 
-// Параметры:
-//  Токен  - Строка       - Токен                               - token
-//  IDЧата - Строка,Число - ID чата темы                        - forum
-//  IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("chat_id"          , IDЧата, "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
-    
-    Если ЗначениеЗаполнено(IDТемы) Тогда
-        Метод = "/unpinAllForumTopicMessages";
-    Иначе
-        Метод = "/unpinAllGeneralForumTopicMessages";
-    КонецЕсли;
-        
-    URL   = "api.telegram.org/bot" + Токен + Метод;
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка)
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид);
-
-    Расширение  = "";
-    Метод       = "";
-    
-    ОпределитьМетодОтправки(Вид, Метод, Расширение);
-    ПреобразоватьДанныеФайла(Файл, Расширение, Вид);
-    OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , "Строка"     , Параметры);
-    OPI_Инструменты.ДобавитьПоле("caption"     , Текст     , "Строка"     , Параметры);
-    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
-    
-    ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
-    СтруктураФайлов = Новый Структура;
-    СтруктураФайлов.Вставить(Вид + Расширение, Файл);
-
-    URL   = "api.telegram.org/bot" + Токен + Метод;
-    Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");
-
-    Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеТемойФорума(Знач Токен
-    , Знач IDЧата
-    , Знач Заголовок = Неопределено
-    , Знач IDИконки = Неопределено
-    , Знач IDТемы = "")
-    
-    Строка_ = "Строка";
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("name"                , Заголовок, Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("chat_id"             , IDЧата   , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("message_thread_id"   , IDТемы   , Строка_, Параметры);
-    
-    Если ЗначениеЗаполнено(IDТемы) Тогда
-        Метод  = "/editForumTopic";    
-    Иначе    
-        Метод = "/createForumTopic";    
-    КонецЕсли;
-    
-    OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);       
-    Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") 
-        
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Если ЗначениеЗаполнено(IDТемы) Тогда
-        Форум = "Forum";
-    Иначе
-        Форум = "GeneralForum";
-    КонецЕсли;
-    
-    Метод     = ОпределитьМетодУправленияФорумом(Статус, Форум);
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("chat_id"          , IDЧата, "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
-   
-    URL   = "api.telegram.org/bot" + Токен + Метод;
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть);
-
-    Если Скрыть Тогда
-        Метод = "/hideGeneralForumTopic";
-    Иначе
-        Метод = "/unhideGeneralForumTopic";
-    КонецЕсли;
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры);
-    
-    URL   = "api.telegram.org/bot" + Токен + Метод;
-    Ответ = OPI_Инструменты.Get(URL, Параметры);
-    
-    Возврат Ответ;
-
-КонецФункции                 
-
-Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) 
-    
-    Открыть = 1;
-    Закрыть = 2;
-    Удалить = 3;
-    
-    Если Статус = Открыть Тогда 
-        Метод = "/reopen" + Форум + "Topic";
-    ИначеЕсли Статус = Закрыть Тогда
-        Метод = "/close" + Форум + "Topic";
-    ИначеЕсли Статус = Удалить Тогда
-        Метод = "/deleteForumTopic";
-    Иначе 
-        ВызватьИсключение "Некорректный статус управления форумом";
-    КонецЕсли;
-    
-    Возврат Метод;
-
-КонецФункции
-
-Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок)
-    
-    Строки = Новый Массив;
-    
-    Для Каждого Кнопка Из МассивКнопок Цикл
-        Кнопки = Новый Массив;
-        Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
-        Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
-        Строки.Добавить(Кнопки);
-    КонецЦикла;
-
-    Возврат Строки;
-    
-КонецФункции
-
-Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок)
-    
-    Строки = Новый Массив;
-    Кнопки = Новый Массив;
-    
-    Для Каждого Кнопка Из МассивКнопок Цикл
-        Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
-        Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
-    КонецЦикла;
-    
-    Строки.Добавить(Кнопки);
-    
-    Возврат Строки;
-
-КонецФункции
-
-Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа)
-    
-    Счетчик = 0;
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-    
-    Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда
-        ВызватьИсключение("Не удалось получить информацию из json медиа!");
-        Возврат;
-    КонецЕсли;
-   
-    Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл
-        
-        Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда
-            
-            Двоичные = ТекущийФайл.Ключ;
-            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные);
-            
-            ЭтотФайл = Новый Файл(ТекущийФайл.Ключ);           
-            ИмяМедиа = ТекущийФайл.Значение 
-                + Строка(Счетчик) 
-                + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, "");
-                
-            ПолноеИмяМедиа  = СтрЗаменить(ИмяМедиа, ".", "___");
-            
-        Иначе
-            Двоичные        = ТекущийФайл.Ключ;
-            ИмяМедиа        = ТекущийФайл.Значение + Строка(Счетчик);
-            ПолноеИмяМедиа  = ИмяМедиа;
-        КонецЕсли;
-        
-        СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные);
-        
-        СтруктураМедиа = Новый Структура;
-        СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение);
-        СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа);
-        
-        Если Счетчик = 0 Тогда
-            СтруктураМедиа.Вставить("caption", Текст);
-        КонецЕсли;
-        
-        Медиа.Добавить(СтруктураМедиа);
-        
-        Счетчик = Счетчик + 1;
-        
-    КонецЦикла;
-
-    Медиа = OPI_Инструменты.JSONСтрокой(Медиа);
-    
-КонецПроцедуры
-
-Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры)
-    
-    IDЧата     = OPI_Инструменты.ЧислоВСтроку(IDЧата);
-    МассивЧата = СтрРазделить(IDЧата, "*", Ложь);
-    
-    Если МассивЧата.Количество() > 1 Тогда
-        
-        IDЧата = МассивЧата[0];
-        IDТемы = МассивЧата[1];
-        
-        Параметры.Вставить("message_thread_id", IDТемы);
-        
-    КонецЕсли;
-    
-    Параметры.Вставить("chat_id", IDЧата);
-
-КонецПроцедуры
-
-Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение)
-    
-    Если Вид = "photo" Тогда
-        Метод = "/sendPhoto";
-    ИначеЕсли Вид = "video" Тогда
-        Метод = "/sendVideo";
-    ИначеЕсли Вид = "audio" Тогда
-        Метод = "/sendAudio";
-    ИначеЕсли Вид = "document" Тогда
-        Метод = "/sendDocument";
-    ИначеЕсли Вид = "animation" Тогда
-        Метод = "/sendAnimation";
-        Расширение = ".gif";
-    Иначе
-        ВызватьИсключение "Некорректный вид отправки";
-    КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид)
-    
-    Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
-        
-        ТекущийФайл = Новый Файл(Файл);
-        Расширение  = ?(Вид = "document", ТекущийФайл.Расширение, Расширение);
-        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-        
-    КонецЕсли;
-
-    Расширение = СтрЗаменить(Расширение, ".", "___");
-    
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Telegram.os
+// Библиотека: Telegram
+// Команда CLI: telegram
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UnreachableCode-off
+// BSLLS:CommentedCode-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область ПолучениеДанныхИНастройка
+
+// Получить информацию о боте
+// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д.
+// 
+// Параметры:
+//  Токен - Строка - Токен бота - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПолучитьИнформациюБота(Знач Токен) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL   = "api.telegram.org/bot" + Токен + "/getMe";
+    Ответ = OPI_Инструменты.Get(URL);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить обновления
+// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме
+//
+// Параметры:
+//  Токен    - Строка       - Токен бота                             - token
+//  Таймаут  - Строка,Число - Время ожидания новых событий           - timeout
+//  Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL   = "api.telegram.org/bot" + Токен + "/getUpdates";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры);
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+    Возврат Ответ;
+
+КонецФункции
+
+// Установить Webhook
+// Устанавливает URL обработчика событий бота для работы в режиме Webhook 
+//          
+// Параметры:
+//  Токен - Строка - Токен бота                                      - token
+//  URL   - Строка - Адрес обработки запросов от Telegram (с https:) - url
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры);
+
+    URL   = "api.telegram.org/bot" + Токен + "/setWebHook";
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Удалить Webhook
+// Удаляет URL обработчика событий бота для работы в режиме Webhook
+// 
+// Параметры:
+//  Токен - Строка - Токен бота - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция УдалитьWebhook(Знач Токен) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL   = "api.telegram.org/bot" + Токен + "/deleteWebHook";
+    Ответ = OPI_Инструменты.Get(URL);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Скачать файл
+// Скачивает файл с серверов Telegram
+// 
+// Параметры:
+//  Токен   - Строка - Токен                   - token
+//  IDФайла - Строка - ID файла для скачивания - fileid
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт
+
+    Result = "result";
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); 
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);    
+            
+    Параметры = Новый Структура("file_id", IDФайла);
+
+    URL   = "api.telegram.org/bot" + Токен + "/getFile";
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+    
+    Путь = Ответ[Result]["file_path"];
+    
+    Если Не ЗначениеЗаполнено(Путь) Тогда
+        Возврат Ответ;
+    КонецЕсли;
+    
+    URL   = "api.telegram.org/file/bot" + Токен + "/" + Путь;
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+    
+    Возврат Ответ;   
+    
+КонецФункции
+
+// ОбработатьДанные Telegram Mini App
+// Обрабатывает данные TMA и опредеяет их достоверность
+// 
+// Параметры:
+//  СтрокаДанных - Строка - querry из Telegram.WebApp.initData
+//  Токен        - Строка - Токен бота
+// 
+// Возвращаемое значение:
+//  Соответствие из Строка - Соответствие данных с результатом проверки в поле passed
+Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных);
+    
+    СтрокаДанных    = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
+    СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
+    Ключ            = "WebAppData";
+    Хэш             = "";
+    КлючДвоичные    = ПолучитьДвоичныеДанныеИзСтроки(Ключ);
+
+    Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен));
+
+    ТЗнач = Новый ТаблицаЗначений;
+    ТЗнач.Колонки.Добавить("Ключ");
+    ТЗнач.Колонки.Добавить("Значение");
+
+    Для Каждого Данные Из СтруктураДанных Цикл
+
+        НоваяСтрока             = ТЗнач.Добавить();
+        НоваяСтрока.Ключ        = Данные.Ключ;
+        НоваяСтрока.Значение    = Данные.Значение;
+
+    КонецЦикла;
+
+    ТЗнач.Сортировать("Ключ");
+
+    СоответствиеВозврата = Новый Соответствие;
+    DCS                  = "";
+
+    Для Каждого СтрокаТЗ Из ТЗнач Цикл
+
+        Если СтрокаТЗ.Ключ <> "hash" Тогда
+            DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
+            СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
+        Иначе
+            Хэш = СтрокаТЗ.Значение;
+        КонецЕсли;
+
+    КонецЦикла;
+
+    DCS     = Лев(DCS, СтрДлина(DCS) - 1);
+    Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
+
+    Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
+
+    Если Финал = вРег(Хэш) Тогда
+        Ответ = Истина;
+    Иначе
+        Ответ = Ложь;
+    КонецЕсли;
+
+    СоответствиеВозврата.Вставить("passed", Ответ);
+
+    Возврат СоответствиеВозврата;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОтправкаДанных
+
+// Отправить текстовое сообщение
+// Отправляет текстовое сообщение в чат или канал
+// 
+// Параметры:
+//  Токен      - Строка       - Токен бота                                        - token
+//  IDЧата     - Строка,Число - ID целевого чата или IDЧата*IDТемы                - chat
+//  Текст      - Строка       - Текст сообщения                                   - text
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//  Разметка   - Строка       - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьТекстовоеСообщение(Знач Токен
+	, Знач IDЧата
+	, Знач Текст
+	, Знач Клавиатура = ""
+	, Знач Разметка = "Markdown") Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);    
+    OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка);
+            
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , "Строка"     , Параметры);
+    OPI_Инструменты.ДобавитьПоле("text"        , Текст     , "Строка"     , Параметры);
+    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
+    
+    ДобавитьИдентификаторЧата(IDЧата, Параметры);
+    
+    URL   = "api.telegram.org/bot" + Токен + "/sendMessage";
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Отправить картинку
+// Отправляет картинку в чат или канал
+// 
+// Параметры:
+//  Токен      - Строка                - Токен бота                                - token
+//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
+//  Текст      - Строка                - Текст сообщения                           - text
+//  Картинка   - ДвоичныеДанные,Строка - Файл картинки                             - picture
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьКартинку(Знач Токен
+	, Знач IDЧата
+	, Знач Текст
+	, Знач Картинка
+	, Знач Клавиатура = ""
+	, Знач Разметка = "Markdown") Экспорт
+
+    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить видео
+// Отправляет видео в чат или канал
+// 
+// Параметры:
+//  Токен      - Строка                - Токен бота                                - token
+//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
+//  Текст      - Строка                - Текст сообщения                           - text
+//  Видео      - ДвоичныеДанные,Строка - Файл видео                                - video
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьВидео(Знач Токен
+	, Знач IDЧата
+	, Знач Текст
+	, Знач Видео
+	, Знач Клавиатура = ""
+	, Знач Разметка = "Markdown") Экспорт
+
+    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить аудио
+// Отправляет аудиофайл в чат или канал
+// 
+// Параметры:
+//  Токен      - Строка                - Токен бота                                - token
+//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
+//  Текст      - Строка                - Текст сообщения                           - text
+//  Аудио      - ДвоичныеДанные,Строка - Файл аудио                                - audio
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьАудио(Знач Токен
+	, Знач IDЧата
+	, Знач Текст
+	, Знач Аудио
+	, Знач Клавиатура = ""
+	, Знач Разметка = "Markdown") Экспорт
+
+    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить документ
+// Отправляет документ в чат или канал
+// 
+// Параметры:
+//  Токен      - Строка                - Токен бота                                - token
+//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
+//  Текст      - Строка                - Текст сообщения                           - text
+//  Документ   - ДвоичныеДанные,Строка - Файл документа                            - doc
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьДокумент(Знач Токен
+	, Знач IDЧата
+	, Знач Текст
+	, Знач Документ
+	, Знач Клавиатура = ""
+	, Знач Разметка = "Markdown") Экспорт
+
+    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить гифку
+// Отправляет гифку в чат или канал
+// 
+// Параметры:
+//  Токен      - Строка                - Токен бота                                - token
+//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
+//  Текст      - Строка                - Текст сообщения                           - text
+//  Гифка      - ДвоичныеДанные,Строка - Файл гифки                                - gif
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьГифку(Знач Токен
+	, Знач IDЧата
+	, Знач Текст
+	, Знач Гифка
+	, Знач Клавиатура = ""
+	, Знач Разметка = "Markdown") Экспорт
+
+    Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить группу медиафайлов
+// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video
+// 
+// Параметры:
+//  Токен      - Строка                - Токен бота                                - token
+//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
+//  Текст      - Строка                - Текст сообщения                           - text
+//  СоответствиеФайлов - Соответствие из Строка - Коллекция файлов  - media - JSON файлов или путь к .json
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//  Разметка   - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьМедиагруппу(Знач Токен
+	, Знач IDЧата
+	, Знач Текст
+	, Знач СоответствиеФайлов
+	, Знач Клавиатура = ""
+	, Знач Разметка = "Markdown") Экспорт
+    
+    // СоответствиеФайлов
+    // Ключ - Файл, Значение - Тип
+    // Типы: audio, document, photo, video
+    // Нельзя замешивать разные типы!
+
+	Строка_ = "Строка";
+	
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
+    
+    OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
+
+    URL             = "api.telegram.org/bot" + Токен + "/sendMediaGroup";
+    СтруктураФайлов = Новый Структура;
+    Медиа           = Новый Массив;
+    Параметры       = Новый Структура;
+    
+    ДобавитьИдентификаторЧата(IDЧата, Параметры);
+    СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа);
+    
+    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("caption"     , Текст     , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("media"       , Медиа     , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
+
+    Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Отправить местоположение
+// Отправляет местоположение по географической широте и долготе в чат или канал
+// 
+// Параметры:
+//  Токен      - Строка                - Токен бота                                - token
+//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
+//  Широта     - Строка,Число          - Географическая широта                     - lat
+//  Долгота    - Строка,Число          - Географическая долгота                    - long
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт
+
+	Строка_ = "Строка";
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+    
+    URL = "api.telegram.org/bot" + Токен + "/sendLocation";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode"  , "Markdown" , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("latitude"    , Широта     , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("longitude"   , Долгота    , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры);
+    
+    ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Отправить контакт
+// Отправляет контакт с именем и номером телефона
+// 
+// Параметры:
+//  Токен      - Строка                - Токен бота                                - token
+//  IDЧата     - Строка,Число          - ID целевого чата или IDЧата*IDТемы        - chat
+//  Имя        - Строка                - Имя контакта                              - name
+//  Фамилия    - Строка                - Фамилия контакта                          - surname
+//  Телефон    - Строка                - Телефон контакта                          - phone
+//  Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт
+
+	Строка_ = "Строка";
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+    
+    URL = "api.telegram.org/bot" + Токен + "/sendContact";
+
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode"  , "Markdown", Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("first_name"  , Имя       , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("last_name"   , Фамилия   , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("phone_number", Телефон   , Строка_      , Параметры);
+    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
+    
+    ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Отправить опрос
+// Отправляет опрос с вариантами ответа
+// 
+// Параметры:
+//  Токен         - Строка                - Токен бота                                 - token
+//  IDЧата        - Строка,Число          - ID целевого чата или IDЧата*IDТемы         - chat
+//  Вопрос        - Строка                - Вопрос опроса                              - question
+//  МассивОтветов - Массив из Строка      - Массив вариантов ответа                    - options
+//  Анонимный     - Булево                - Анонимность опроса                         - anonymous
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
+
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный);
+    
+    URL = "api.telegram.org/bot" + Токен + "/sendPoll";
+
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown"   , "Строка"     , Параметры);
+    OPI_Инструменты.ДобавитьПоле("question"  , Вопрос       , "Строка"     , Параметры);
+    OPI_Инструменты.ДобавитьПоле("options"   , МассивОтветов, "СтрокаФайла", Параметры);
+    
+    Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0));   
+    ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Переслать сообщение
+// Пересылает сообщение между чатами или в рамках одного чата
+// 
+// Параметры:
+//  Токен         - Строка       - Токен бота                         - token
+//  IDОригинала   - Строка,Число - ID оригинального сообщения         - message
+//  ОткудаID      - Строка,Число - ID чата оригинального сообщения    - from
+//  КудаID        - Строка,Число - ID целевого чата или IDЧата*IDТемы - to
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID);
+    
+    URL = "api.telegram.org/bot" + Токен + "/forwardMessage";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID   , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("message_id"  , IDОригинала, "Строка", Параметры);
+
+    ДобавитьИдентификаторЧата(КудаID, Параметры);
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Сформировать клавиатуру по массиву кнопок
+// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели
+// 
+// Параметры:
+//  МассивКнопок  - Массив из Строка - Массив кнопок                                        - buttons 
+//  ПодСообщением - Булево           - Клавиатура под сообщением или на нижней панели       - under
+//  ОднаПодОдной  - Булево           - Истина > кнопки выводятся в столбик, Ложь > в строку - column
+// 
+// Возвращаемое значение:
+//  Строка -  JSON клавиатуры
+Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок
+    , Знач ПодСообщением = Ложь
+    , Знач ОднаПодОдной = Истина) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
+    
+    Если ОднаПодОдной Тогда
+        Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
+    Иначе
+        Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок);
+    КонецЕсли;
+
+    Если ПодСообщением Тогда
+        СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
+    Иначе
+        СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина);
+    КонецЕсли;
+
+    Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра);
+
+    Возврат Клавиатура;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Администрирование
+
+// Бан
+// Банит пользователя в выбранном чате
+// 
+// Параметры:
+//  Токен          - Строка       - Токен бота                         - token
+//  IDЧата         - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+//  IDПользователя - Строка,Число - ID целевого пользователя           - user
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
+
+	Строка_ = "Строка";
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL = "api.telegram.org/bot" + Токен + "/banChatMember";
+
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown"    , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата        , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("user_id"   , IDПользователя, Строка_, Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Разбан
+// Разбанивает забаненного ранее пользователя
+// 
+// Параметры:
+//  Токен          - Строка       - Токен бота                         - token
+//  IDЧата         - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+//  IDПользователя - Строка,Число - ID целевого пользователя           - user
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
+
+	Строка_ = "Строка";
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL = "api.telegram.org/bot" + Токен + "/unbanChatMember";
+
+    Параметры = Новый Структура;   
+    OPI_Инструменты.ДобавитьПоле("parse_mode"    , "Markdown"    , Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("chat_id"       , IDЧата        , Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("user_id"       , IDПользователя, Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь          , "Булево", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Создать ссылку-приглашение
+// Создает ссылку для вступления в закрытый чат
+// 
+// Параметры:
+//  Токен              - Строка         - Токен бота                                               - token
+//  IDЧата             - Строка,Число   - ID целевого чата или IDЧата*IDТемы                       - chat
+//  Заголовок          - Строка         - Заголовок приглашения                                    - title
+//  ДатаИстечения      - Дата           - Дата окончания жизни ссылки (безсрочно, если не указано) - expire
+//  ЛимитПользователей - Число          - Лимит пользователей (бесконечно, если не указано)        - limit
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция СоздатьСсылкуПриглашение(Знач Токен
+    , Знач IDЧата
+    , Знач Заголовок = ""
+    , Знач ДатаИстечения = ""
+    , Знач ЛимитПользователей = 0) Экспорт
+
+	Строка_ = "Строка";
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode"    , "Markdown"        , Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("chat_id"       , IDЧата            , Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("name"          , Заголовок         , Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("member_limit"  , ЛимитПользователей, Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("expire_date"   , ДатаИстечения     , "Дата"  , Параметры);
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Закрепить сообщение
+// Закрепляет сообщение в шапке чата
+// 
+// Параметры:
+//  Токен       - Строка       - Токен                 - token
+//  IDЧата      - Строка,Число - ID целевого чата      - chat
+//  IDСообщения - Строка,Число - ID целевого сообщения - message
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
+    
+    Строка_ = "Строка";
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL = "api.telegram.org/bot" + Токен + "/pinChatMessage";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode"          , "Markdown" , Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("chat_id"             , IDЧата     , Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("message_id"          , IDСообщения, Строка_ , Параметры);
+    OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь       , "Булево", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Открепить сообщение
+// Открепляет сообщение в шапке чата
+// 
+// Параметры:
+//  Токен       - Строка       - Токен бота            - token
+//  IDЧата      - Строка,Число - ID целевого чата      - chat
+//  IDСообщения - Строка,Число - ID целевого сообщения - message
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
+    
+    Строка_ = "Строка";
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить число участников
+// Получает общее число участников чата
+// 
+// Параметры:
+//  Токен  - Строка       - Токен бота       - token
+//  IDЧата - Строка,Число - ID целевого чата - chat
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("chat_id"   , IDЧата     , "Строка", Параметры);
+
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСТемамиФорума
+
+// Получить список иконок-аватаров
+// Получает соответствие ID Emoji для установки в качестве иконок тем форума
+// 
+// Параметры:
+//  Токен - Строка - Токен - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji
+Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Result    = "result";
+    URL       = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers";     
+    Ответ     = OPI_Инструменты.Get(URL);    
+    Иконки    = Ответ[Result];
+    
+    Если Не ЗначениеЗаполнено(Иконки) Тогда
+    	Возврат Ответ;
+    КонецЕсли; 
+    
+    Коллекция = Новый Соответствие;
+    
+    Для Каждого Иконка Из Иконки Цикл
+        Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]);
+    КонецЦикла;
+       
+    Возврат Коллекция;
+
+КонецФункции
+
+// Создать тему форума
+// Создает новую тему в группе с включенным функционалом тем
+// 
+// Параметры:
+//  Токен     - Строка       - Токен                            - token
+//  IDЧата    - Строка,Число - ID чата создания темы            - forum
+//  Заголовок - Строка       - Заголовок темы                   - title
+//  IDИконки  - Строка       - См. ПолучитьСписокИконокАватаров - icon
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт
+    Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки);
+КонецФункции
+
+// Изменить тему форума
+// Создает новую тему в группе с включенным функционалом тем
+// 
+// Параметры:
+//  Токен     - Строка       - Токен                            - token
+//  IDЧата    - Строка,Число - ID чата создания темы            - forum
+//  IDТемы    - Строка,Число - ID темы                          - topic
+//  Заголовок - Строка       - Новый заголовок                  - title
+//  IDИконки  - Строка       - См. ПолучитьСписокИконокАватаров - icon
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ИзменитьТемуФорума(Знач Токен
+    , Знач IDЧата
+    , Знач IDТемы
+    , Знач Заголовок = Неопределено
+    , Знач IDИконки = Неопределено) Экспорт   
+     
+    Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы);
+КонецФункции
+
+// Закрыть тему форума
+// Закрывает тему для новых сообщений
+// 
+// Параметры:
+//  Токен  - Строка       - Токен        - token
+//  IDЧата - Строка,Число - ID чата темы - forum
+//  IDТемы - Строка,Число - ID темы      - topic
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
+    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы);    
+КонецФункции
+
+// Открыть тему форума
+// Повторно открывает ранее закрытую тему форума
+// 
+// Параметры:
+//  Токен  - Строка       - Токен        - token
+//  IDЧата - Строка,Число - ID чата темы - forum
+//  IDТемы - Строка,Число - ID темы      - topic
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
+    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы);    
+КонецФункции
+
+// Удалить тему форума
+// Удаляет тему форума
+// 
+// Параметры:
+//  Токен  - Строка       - Токен        - token
+//  IDЧата - Строка,Число - ID чата темы - forum
+//  IDТемы - Строка,Число - ID темы      - topic
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт
+    Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы);    
+КонецФункции
+
+// Скрыть главную тему форума
+// Скрывает главную тему форума
+// 
+// Параметры:
+//  Токен  - Строка       - Токен        - token
+//  IDЧата - Строка,Число - ID чата темы - forum
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
+    Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина);
+КонецФункции
+
+// Показать главную тему форума
+// Показывает ранее скрытую главную тему форума
+// 
+// Параметры:
+//  Токен  - Строка       - Токен        - token
+//  IDЧата - Строка,Число - ID чата темы - forum
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
+    Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь);
+КонецФункции
+
+// Изменить имя главной темы форума
+// Изменяет имя главной темы форума
+// 
+// Параметры:
+//  Токен     - Строка       - Токен                   - token
+//  IDЧата    - Строка,Число - ID чата темы            - forum
+//  Заголовок - Строка       - Новое имя главной темы  - title
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата   , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("name"   , Заголовок, "Строка", Параметры);
+    
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Очистить список закрепленных сообщений темы
+// Очищает список закрепленных сообщений в теме форума
+// 
+// Параметры:
+//  Токен  - Строка       - Токен                               - token
+//  IDЧата - Строка,Число - ID чата темы                        - forum
+//  IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("chat_id"          , IDЧата, "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
+    
+    Если ЗначениеЗаполнено(IDТемы) Тогда
+        Метод = "/unpinAllForumTopicMessages";
+    Иначе
+        Метод = "/unpinAllGeneralForumTopicMessages";
+    КонецЕсли;
+        
+    URL   = "api.telegram.org/bot" + Токен + Метод;
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка)
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид);
+
+    Расширение  = "";
+    Метод       = "";
+    
+    ОпределитьМетодОтправки(Вид, Метод, Расширение);
+    ПреобразоватьДанныеФайла(Файл, Расширение, Вид);
+    OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("parse_mode"  , Разметка  , "Строка"     , Параметры);
+    OPI_Инструменты.ДобавитьПоле("caption"     , Текст     , "Строка"     , Параметры);
+    OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
+    
+    ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+    СтруктураФайлов = Новый Структура;
+    СтруктураФайлов.Вставить(Вид + Расширение, Файл);
+
+    URL   = "api.telegram.org/bot" + Токен + Метод;
+    Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");
+
+    Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеТемойФорума(Знач Токен
+    , Знач IDЧата
+    , Знач Заголовок = Неопределено
+    , Знач IDИконки = Неопределено
+    , Знач IDТемы = "")
+    
+    Строка_ = "Строка";
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("name"                , Заголовок, Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("chat_id"             , IDЧата   , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("message_thread_id"   , IDТемы   , Строка_, Параметры);
+    
+    Если ЗначениеЗаполнено(IDТемы) Тогда
+        Метод  = "/editForumTopic";    
+    Иначе    
+        Метод = "/createForumTopic";    
+    КонецЕсли;
+    
+    OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);       
+    Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "") 
+        
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Если ЗначениеЗаполнено(IDТемы) Тогда
+        Форум = "Forum";
+    Иначе
+        Форум = "GeneralForum";
+    КонецЕсли;
+    
+    Метод     = ОпределитьМетодУправленияФорумом(Статус, Форум);
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("chat_id"          , IDЧата, "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
+   
+    URL   = "api.telegram.org/bot" + Токен + Метод;
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть);
+
+    Если Скрыть Тогда
+        Метод = "/hideGeneralForumTopic";
+    Иначе
+        Метод = "/unhideGeneralForumTopic";
+    КонецЕсли;
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры);
+    
+    URL   = "api.telegram.org/bot" + Токен + Метод;
+    Ответ = OPI_Инструменты.Get(URL, Параметры);
+    
+    Возврат Ответ;
+
+КонецФункции                 
+
+Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум) 
+    
+    Открыть = 1;
+    Закрыть = 2;
+    Удалить = 3;
+    
+    Если Статус = Открыть Тогда 
+        Метод = "/reopen" + Форум + "Topic";
+    ИначеЕсли Статус = Закрыть Тогда
+        Метод = "/close" + Форум + "Topic";
+    ИначеЕсли Статус = Удалить Тогда
+        Метод = "/deleteForumTopic";
+    Иначе 
+        ВызватьИсключение "Некорректный статус управления форумом";
+    КонецЕсли;
+    
+    Возврат Метод;
+
+КонецФункции
+
+Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок)
+    
+    Строки = Новый Массив;
+    
+    Для Каждого Кнопка Из МассивКнопок Цикл
+        Кнопки = Новый Массив;
+        Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
+        Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
+        Строки.Добавить(Кнопки);
+    КонецЦикла;
+
+    Возврат Строки;
+    
+КонецФункции
+
+Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок)
+    
+    Строки = Новый Массив;
+    Кнопки = Новый Массив;
+    
+    Для Каждого Кнопка Из МассивКнопок Цикл
+        Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
+        Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
+    КонецЦикла;
+    
+    Строки.Добавить(Кнопки);
+    
+    Возврат Строки;
+
+КонецФункции
+
+Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа)
+    
+    Счетчик = 0;
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+    
+    Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда
+        ВызватьИсключение("Не удалось получить информацию из json медиа!");
+        Возврат;
+    КонецЕсли;
+   
+    Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл
+        
+        Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда
+            
+            Двоичные = ТекущийФайл.Ключ;
+            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные);
+            
+            ЭтотФайл = Новый Файл(ТекущийФайл.Ключ);           
+            ИмяМедиа = ТекущийФайл.Значение 
+                + Строка(Счетчик) 
+                + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, "");
+                
+            ПолноеИмяМедиа  = СтрЗаменить(ИмяМедиа, ".", "___");
+            
+        Иначе
+            Двоичные        = ТекущийФайл.Ключ;
+            ИмяМедиа        = ТекущийФайл.Значение + Строка(Счетчик);
+            ПолноеИмяМедиа  = ИмяМедиа;
+        КонецЕсли;
+        
+        СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные);
+        
+        СтруктураМедиа = Новый Структура;
+        СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение);
+        СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа);
+        
+        Если Счетчик = 0 Тогда
+            СтруктураМедиа.Вставить("caption", Текст);
+        КонецЕсли;
+        
+        Медиа.Добавить(СтруктураМедиа);
+        
+        Счетчик = Счетчик + 1;
+        
+    КонецЦикла;
+
+    Медиа = OPI_Инструменты.JSONСтрокой(Медиа);
+    
+КонецПроцедуры
+
+Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры)
+    
+    IDЧата     = OPI_Инструменты.ЧислоВСтроку(IDЧата);
+    МассивЧата = СтрРазделить(IDЧата, "*", Ложь);
+    
+    Если МассивЧата.Количество() > 1 Тогда
+        
+        IDЧата = МассивЧата[0];
+        IDТемы = МассивЧата[1];
+        
+        Параметры.Вставить("message_thread_id", IDТемы);
+        
+    КонецЕсли;
+    
+    Параметры.Вставить("chat_id", IDЧата);
+
+КонецПроцедуры
+
+Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение)
+    
+    Если Вид = "photo" Тогда
+        Метод = "/sendPhoto";
+    ИначеЕсли Вид = "video" Тогда
+        Метод = "/sendVideo";
+    ИначеЕсли Вид = "audio" Тогда
+        Метод = "/sendAudio";
+    ИначеЕсли Вид = "document" Тогда
+        Метод = "/sendDocument";
+    ИначеЕсли Вид = "animation" Тогда
+        Метод = "/sendAnimation";
+        Расширение = ".gif";
+    Иначе
+        ВызватьИсключение "Некорректный вид отправки";
+    КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид)
+    
+    Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
+        
+        ТекущийФайл = Новый Файл(Файл);
+        Расширение  = ?(Вид = "document", ТекущийФайл.Расширение, Расширение);
+        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+        
+    КонецЕсли;
+
+    Расширение = СтрЗаменить(Расширение, ".", "___");
+    
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Twitter.os b/src/ru/OInt/core/Modules/OPI_Twitter.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_Twitter.os
rename to src/ru/OInt/core/Modules/OPI_Twitter.os
index 0e52e5651e..21cd27e345 100644
--- a/ru/OInt/core/Modules/OPI_Twitter.os
+++ b/src/ru/OInt/core/Modules/OPI_Twitter.os
@@ -1,682 +1,682 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Twitter.os
-// Библиотека: Twitter
-// Команда CLI: twitter
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
-// и почитать комментарии
-
-// BSLLS:Typo-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:UsingServiceTag-off
-
-//@skip-check method-too-many-params
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область ДанныеИНастройка
-
-// Получить ссылку для авторизации
-// Формирует ссылку для авторизации через браузер
-// 
-// Параметры:
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Строка -  URL для перехода в браузере
-Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    
-    ПараметрыURL = Новый Структура;
-        
-    ПараметрыURL.Вставить("response_type"        , "code");
-    ПараметрыURL.Вставить("client_id"            , Параметры_["client_id"]);
-    ПараметрыURL.Вставить("redirect_uri"         , Параметры_["redirect_uri"]);
-    ПараметрыURL.Вставить("scope"                , Параметры_["scope"]);
-    ПараметрыURL.Вставить("state"                , "state");
-    ПараметрыURL.Вставить("code_challenge"       , "challenge");
-    ПараметрыURL.Вставить("code_challenge_method", "plain");
-        
-    ПараметрыURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
-    Линк = "https://twitter.com/i/oauth2/authorize" + ПараметрыURL;
-        
-    Возврат Линк;
-    
-КонецФункции
-
-// Получить токен
-// Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации
-// 
-// Параметры:
-//  Код        - Строка              - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации - code
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Код);
-        
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
-    ПараметрыЗапроса = Новый Структура;
-    ПараметрыЗапроса.Вставить("code"         , Код);
-    ПараметрыЗапроса.Вставить("grant_type"   , "authorization_code");
-    ПараметрыЗапроса.Вставить("client_id"    , Параметры_["client_id"]);
-    ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
-    ПараметрыЗапроса.Вставить("code_verifier", "challenge");
-    
-    Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
-        , ПараметрыЗапроса, , Ложь);
-        
-    Возврат Ответ;
-    
-КонецФункции
-
-// Обновить токен 
-// Обновляет v2 токен при помощи refresh_token
-// 
-// Параметры:
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция ОбновитьТокен(Знач Параметры = "") Экспорт
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Refresh    = "refresh_token";
-    
-    ПараметрыЗапроса = Новый Структура;
-    ПараметрыЗапроса.Вставить(Refresh        , Параметры_[Refresh]);
-    ПараметрыЗапроса.Вставить("grant_type"   , Refresh);
-    ПараметрыЗапроса.Вставить("client_id"    , Параметры_["client_id"]);
-    
-    Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
-    , ПараметрыЗапроса, , Ложь);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// !NOCLI
-// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri
-// Вызывает метод получения токена, так как для получения токена из кода, приходящего
-// на redirect_uri после авторизации через браузер есть всего 30 секунд
-// 
-// Параметры:
-//  Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис
-// 
-// Возвращаемое значение:
-//  HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
-Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт
-    
-    Код         = Запрос.ПараметрыЗапроса["code"];    
-    ОтветТокен  = ПолучитьТокен(Код);
-    
-    // BSLLS:CommentedCode-off
-    // Предпочтительное хранение токенов
-    // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
-    // Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
-    // BSLLS:CommentedCode-on
-    
-    Возврат ОтветТокен;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область Твиты
-
-// !NOCLI
-// Создать произвольный твит
-// 
-// Параметры:
-//  Текст - Строка        -  Текст твита
-//  МассивМедиа           -  Массив из Строка,ДвоичныеДанные -  Массив двоичных данных или путей к файлам
-//  МассивВариантовОпроса - Массив из Строка -  Массив вариантов опроса, если необходимо
-//  ДлительностьОпроса    - Строка,Число -  Длительность опроса, если необходимо (опрос без длительности не создается)
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьПроизвольныйТвит(Знач Текст = ""
-    , Знач МассивМедиа = ""
-    , Знач МассивВариантовОпроса = ""
-    , Знач ДлительностьОпроса = ""
-    , Знач Параметры = "") Экспорт 
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ДлительностьОпроса);
-    
-    Если ЗначениеЗаполнено(МассивМедиа) Тогда
-        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивМедиа);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(МассивВариантовОпроса) Тогда
-        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивВариантовОпроса);
-    КонецЕсли;
-    
-    Параметры_         = ПолучитьСтандартныеПараметры(Параметры);
-    URL                = "https://api.twitter.com/2/tweets";
-    Массив             = "Массив";    
-    Поля               = Новый Соответствие;
-    
-    Если ЗначениеЗаполнено(Текст) Тогда
-        Поля.Вставить("text", Текст);
-    КонецЕсли;
-    
-    Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
-        
-        ДлительностьОпроса = Число(ДлительностьОпроса);
-        
-        Если МассивВариантовОпроса.Количество() > 0 Тогда
-        	
-        	СтруктураВарианта = Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса);
-            Поля.Вставить("poll", СтруктураВарианта);
-            
-        КонецЕсли;
-        
-    КонецЕсли;
-    
-    Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда
-        Если МассивМедиа.Количество() > 0 Тогда
-            Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
-        КонецЕсли;
-    КонецЕсли;
-    
-    Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
-    Ответ       = OPI_Инструменты.Post(URL, Поля, Авторизация);
-
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать текстовый твит
-// Создает твит без вложений
-// 
-// Параметры:
-//  Текст      - Строка              - Текст твита                     - text
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
-    Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);    
-КонецФункции
-
-// Создать твит картинки
-// Создает твит с картинкой вложением
-// 
-// Параметры:
-//  Текст          - Строка                          - Текст твита            - text
-//  МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив файлов картинок - pictures
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
-    
-    МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
-    Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);    
-    
-КонецФункции
-
-// Создать твит гифки
-// Создает твит с вложением-гифкой
-// 
-// Параметры:
-//  Текст       - Строка                          - Текст твита         - text
-//  МассивГифок - Массив из Строка,ДвоичныеДанные - Массив файлов гифок - gifs
-//  Параметры   - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
-    
-    МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
-    Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);    
-    
-КонецФункции
-
-// Создать твит видео
-// Создает твит с видеовложением
-// 
-// Параметры:
-//  Текст       - Строка                          - Текст твита         - text
-//  МассивВидео - Массив из Строка,ДвоичныеДанные - Массив файлов видео - videos
-//  Параметры   - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
-    
-    МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
-    Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
-    
-КонецФункции
-
-// Создать твит опрос
-// Создает твит с опросом
-// 
-// Параметры:
-//  Текст           - Строка           - Текст твита               - text
-//  МассивВариантов - Массив из Строка - Массив вариантов опроса   - options
-//  Длительность    - Строка,Число     - Длительность опроса       - duration
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
-    Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);    
-КонецФункции
-
-// Загрузить массив вложений !NOCLI
-// Загружает файлы на сервер и возвращает их ID
-// 
-// Параметры:
-//  МассивФайлов - Массив из Строка, ДвоичныеДанные -  Массив файлов
-//  ТипВложений  - Строка -  Тип вложений
-//  Параметры    - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Массив Из Строка -  Массив ID медиа
-Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ТипВложений);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивФайлов);
-    
-    МассивМедиа = Новый Массив;
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
-    MIS         = "media_id_string";
-    
-    Если ЗначениеЗаполнено(МассивФайлов) Тогда
-                 
-        Для Каждого ФайлОтправки Из МассивФайлов Цикл
-                       
-            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ФайлОтправки);
-            
-            Ответ   = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_);
-            IDМедиа = Ответ[MIS];
-            
-            Если Не ЗначениеЗаполнено(IDМедиа) Тогда
-                Возврат Ответ;
-            КонецЕсли;
-            
-            МассивМедиа.Добавить(IDМедиа);
-            
-        КонецЦикла;
-    
-    КонецЕсли;
-        
-    Возврат МассивМедиа;
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры) 
-   
-    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-   
-    ВидЗапроса = "POST";    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    URL        = "https://upload.twitter.com/1.1/media/upload.json";
-     
-    Если Тип = "tweet_image" Тогда 
-        
-        Поля = Новый Структура;
-        Поля.Вставить("media_data"    , Base64Строка(Файл));
-        Поля.Вставить("media_category", Тип);
-        
-        Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);        
-        Ответ       = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
-        
-    Иначе
-        
-        Ответ = ЗагрузитьМедиаЧастями(Файл, Тип, ВидЗапроса, URL, Параметры_);
-        
-    КонецЕсли;
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ЗагрузитьМедиаЧастями(Знач Файл, Знач Тип, Знач ВидЗапроса, Знач URL, Параметры)
-    
-    Единица          = 1024;
-    Количество       = 4;
-    MediaKey         = "media_key";
-    MIS              = "media_id_string";
-    Command          = "command";
-    Размер           = Файл.Размер();
-    
-    СоответствиеMIME = Новый Соответствие;
-    СоответствиеMIME.Вставить("tweet_image", "image/jpeg");
-    СоответствиеMIME.Вставить("tweet_video", "video/mp4");
-    СоответствиеMIME.Вставить("tweet_gif"  , "image/gif");
-    
-    РазмерЧасти  = Количество * Единица * Единица;
-    МассивЧтения = РазделитьДвоичныеДанные(Файл, РазмерЧасти);
-    
-    Поля = Новый Структура;
-    Поля.Вставить(Command          , "INIT");
-    Поля.Вставить("total_bytes"    , OPI_Инструменты.ЧислоВСтроку(Размер));
-    Поля.Вставить("media_type"     , СоответствиеMIME.Получить(Тип));
-    Поля.Вставить("media_category" , Тип);
-    
-    Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL);
-
-    ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
-    KeyИнициализации   = ОтветИнициализации[MediaKey];
-    IDИнициализации    = ОтветИнициализации[MIS];
-    
-    Если Не ЗначениеЗаполнено(KeyИнициализации) Или Не ЗначениеЗаполнено(IDИнициализации) Тогда
-        Возврат ОтветИнициализации;     
-    КонецЕсли;
-    
-    Счетчик = 0;
-    
-    Для Каждого Часть Из МассивЧтения Цикл
-        
-        Поля = Новый Структура;
-        Поля.Вставить(Command           , "APPEND");
-        Поля.Вставить("media_key"       , KeyИнициализации);
-        Поля.Вставить("segment_index"   , OPI_Инструменты.ЧислоВСтроку(Счетчик));
-        Поля.Вставить("media"           , Часть);
-
-        Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL);
-        
-        OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
-        
-        Счетчик = Счетчик + 1;
-        
-    КонецЦикла;
-    
-    Поля = Новый Структура;
-    Поля.Вставить(Command   , "FINALIZE");
-    Поля.Вставить("media_id", IDИнициализации);
-    
-    СтатусОбработки = ПолучитьСтатусОбработки(Параметры, Поля, URL);
-    
-    Если Не ТипЗнч(СтатусОбработки) = Тип("Строка") Тогда
-        Возврат СтатусОбработки;
-    КонецЕсли;
-            
-    Ответ = ОжидатьЗавершенияОбработки(СтатусОбработки, IDИнициализации, URL, Параметры);
-    
-    Возврат Ответ;
-        
-КонецФункции
-
-Функция ОжидатьЗавершенияОбработки(Знач СтатусОбработки, Знач IDИнициализации, Знач URL, Знач Параметры)
-    
-    ProcessingInfo   = "processing_info";
-    Command          = "command";
-    Поля             = Новый Структура;
-    
-    Поля.Вставить(Command   , "STATUS");
-    Поля.Вставить("media_id", IDИнициализации);
-
-    Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
-         
-        Авторизация     = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL);        
-        Ответ           = OPI_Инструменты.Get(URL, Поля, Авторизация);     
-        Информация      = Ответ[ProcessingInfo];
-
-        Если Не ЗначениеЗаполнено(Информация) Тогда
-            Возврат Ответ;
-        КонецЕсли;
-        
-        СтатусОбработки = Информация["state"];
-        
-        Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
-            Возврат Ответ;
-        КонецЕсли;
-       
-    КонецЦикла;
-    
-    Если СтатусОбработки = "failed" Тогда
-        ВызватьИсключение "Твиттер не смог обработать загруженное вами видео";
-    КонецЕсли;
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
-    
-    // Здесь собрано определение данных, необходимых для работы.
-    // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API,
-    // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга.
-    // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то,
-    // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести
-    // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать 
-    // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1,
-    // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные
-    
-    // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;)
-    
-    // P.S Далее часто упоминается "страница настроек Twitter Developer" - это 
-    // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем)
-    
-    Параметры_ = Новый Соответствие; 
-    Разрешения = "tweet.read tweet.write tweet.moderate.write users.read "
-        + "follows.read follows.write offline.access space.read mute.read "
-        + "mute.write like.read like.write list.read list.write block.read "
-        + "block.write bookmark.read bookmark.write";    
-               
-    // Данные для API v2
-        
-    // redirect_uri  - URL вашего http-сервиса (или другого обработчика запросов) для авторизации
-    // scope         - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен
-    // client_id     - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
-    // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
-    // access_token  - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code)
-    // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч)
-    //                 Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token. 
-    //                 При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить 
-    //                 не получится (access_token тоже не получится) 
-    
-    //           |--> ОбновитьТокен() ->|access_token  --> Используется в т-нии 2-х часов для запросов
-    //           |                      |refresh_token --|
-    //           |--------[через 2 ч.]-------------------|
-     
-    // Данные для API v1.1
-    
-    // oauth_token           - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer 
-    // oauth_token_secret    - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer
-    // oauth_consumer_key    - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
-    // oauth_consumer_secret - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
-    
-    // Эти токены обновлять не надо
-    
-    Параметры_.Вставить("redirect_uri"         , "");
-    Параметры_.Вставить("scope"                , Разрешения);
-    Параметры_.Вставить("client_id"            , "");
-    Параметры_.Вставить("client_secret"        , "");
-    Параметры_.Вставить("access_token"         , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить()
-    Параметры_.Вставить("refresh_token"        , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить()
-    Параметры_.Вставить("oauth_token"          , "");
-    Параметры_.Вставить("oauth_token_secret"   , "");
-    Параметры_.Вставить("oauth_consumer_key"   , "");
-    Параметры_.Вставить("oauth_consumer_secret", "");
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
-    
-    Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
-        Для Каждого ПереданныйПараметр Из Параметры Цикл
-            Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
-        КонецЦикла;
-    КонецЕсли;
-
-    Возврат Параметры_;
-
-КонецФункции
-
-Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL)
-    
-    ТекущаяДата          = OPI_Инструменты.ПолучитьТекущуюДату();
-    ЗаголовокАвторизации = "";
-    МетодХэширования     = "HMAC-SHA1";
-    ВерсияАпи            = "1.0";
-    СтрокаСигнатуры      = "";
-    Подпись              = "";
-    OCK                  = "oauth_consumer_key";
-    OTK                  = "oauth_token";
-    ТекущаяДатаUNIX      = OPI_Инструменты.UNIXTime(ТекущаяДата);
-    ТекущаяДатаUNIX      = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
-    ТаблицаПараметров    = Новый ТаблицаЗначений;
-    ТаблицаПараметров.Колонки.Добавить("Ключ");
-    ТаблицаПараметров.Колонки.Добавить("Значение");
-        
-    Для Каждого Поле Из Поля Цикл 
-        
-        НоваяСтрока = ТаблицаПараметров.Добавить();    
-        НоваяСтрока.Ключ     = Поле.Ключ;
-        НоваяСтрока.Значение = Поле.Значение;
-        
-    КонецЦикла;
-    
-    НоваяСтрока = ТаблицаПараметров.Добавить();
-    НоваяСтрока.Ключ     = OCK;
-    НоваяСтрока.Значение = Параметры[OCK];
-    
-    НоваяСтрока = ТаблицаПараметров.Добавить();
-    НоваяСтрока.Ключ     = OTK;
-    НоваяСтрока.Значение = Параметры[OTK];
-    
-    НоваяСтрока = ТаблицаПараметров.Добавить();
-    НоваяСтрока.Ключ     = "oauth_version";
-    НоваяСтрока.Значение = ВерсияАпи;
-    
-    НоваяСтрока = ТаблицаПараметров.Добавить();
-    НоваяСтрока.Ключ     = "oauth_signature_method";
-    НоваяСтрока.Значение = МетодХэширования;
-
-    НоваяСтрока = ТаблицаПараметров.Добавить();
-    НоваяСтрока.Ключ     = "oauth_timestamp";
-    НоваяСтрока.Значение = ТекущаяДатаUNIX;
-
-    НоваяСтрока = ТаблицаПараметров.Добавить();
-    НоваяСтрока.Ключ     = "oauth_nonce";
-    НоваяСтрока.Значение = ТекущаяДатаUNIX;
-
-    Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
-        
-        СтрокаТаблицы.Ключ     = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL);
-        СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL);
-        
-    КонецЦикла;
-    
-    ТаблицаПараметров.Сортировать("Ключ");
-    
-    Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
-        
-        СтрокаСигнатуры = СтрокаСигнатуры 
-            + СтрокаТаблицы.Ключ 
-            + "="
-            + СтрокаТаблицы.Значение
-            + "&";
-            
-    КонецЦикла;
-    
-    СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
-    СтрокаСигнатуры = вРег(ВидЗапроса) 
-        + "&" 
-        + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL)
-        + "&"
-        + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
-        
-    Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL)
-        + "&" 
-        + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL);
-             
-    Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись)
-        , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры)
-        , ХешФункция.SHA1
-        , 64);
-        
-    Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
-    
-    Разделитель          = """,";
-    ЗаголовокАвторизации = ЗаголовокАвторизации 
-        + "OAuth "
-        + "oauth_consumer_key="""      + Параметры[OCK]        + Разделитель
-        + "oauth_token="""             + Параметры[OTK]        + Разделитель
-        + "oauth_signature_method="""  + МетодХэширования      + Разделитель
-        + "oauth_timestamp="""         + ТекущаяДатаUNIX       + Разделитель
-        + "oauth_nonce="""             + ТекущаяДатаUNIX       + Разделитель
-        + "oauth_version="""           + ВерсияАпи             + Разделитель
-        + "oauth_signature="""         + Сигнатура;
-        
-        СоответствиеЗаголовка = Новый Соответствие;
-        СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации);
-        
-    Возврат СоответствиеЗаголовка;
-        
-КонецФункции
-
-Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры)
-    
-    СоответствиеВозврата = Новый Соответствие;
-    СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
-    
-    Возврат СоответствиеВозврата;
-    
-КонецФункции
-
-Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL)
-
-	ProcessingInfo   = "processing_info";
-    Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL);
-    
-    Ответ      = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);  
-    Информация = Ответ[ProcessingInfo];
-    
-    Если Не ЗначениеЗаполнено(Информация) Тогда
-    	Возврат Ответ;
-    КонецЕсли;
-    
-    СтатусОбработки = Информация["state"];
-    
-    Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
-    	Возврат Ответ;
-    Иначе
-    	Возврат СтатусОбработки;
-    КонецЕсли;	
-    
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Twitter.os
+// Библиотека: Twitter
+// Команда CLI: twitter
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
+// и почитать комментарии
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+
+//@skip-check method-too-many-params
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область ДанныеИНастройка
+
+// Получить ссылку для авторизации
+// Формирует ссылку для авторизации через браузер
+// 
+// Параметры:
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Строка -  URL для перехода в браузере
+Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    
+    ПараметрыURL = Новый Структура;
+        
+    ПараметрыURL.Вставить("response_type"        , "code");
+    ПараметрыURL.Вставить("client_id"            , Параметры_["client_id"]);
+    ПараметрыURL.Вставить("redirect_uri"         , Параметры_["redirect_uri"]);
+    ПараметрыURL.Вставить("scope"                , Параметры_["scope"]);
+    ПараметрыURL.Вставить("state"                , "state");
+    ПараметрыURL.Вставить("code_challenge"       , "challenge");
+    ПараметрыURL.Вставить("code_challenge_method", "plain");
+        
+    ПараметрыURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
+    Линк = "https://twitter.com/i/oauth2/authorize" + ПараметрыURL;
+        
+    Возврат Линк;
+    
+КонецФункции
+
+// Получить токен
+// Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации
+// 
+// Параметры:
+//  Код        - Строка              - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации - code
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Код);
+        
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+    ПараметрыЗапроса = Новый Структура;
+    ПараметрыЗапроса.Вставить("code"         , Код);
+    ПараметрыЗапроса.Вставить("grant_type"   , "authorization_code");
+    ПараметрыЗапроса.Вставить("client_id"    , Параметры_["client_id"]);
+    ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
+    ПараметрыЗапроса.Вставить("code_verifier", "challenge");
+    
+    Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
+        , ПараметрыЗапроса, , Ложь);
+        
+    Возврат Ответ;
+    
+КонецФункции
+
+// Обновить токен 
+// Обновляет v2 токен при помощи refresh_token
+// 
+// Параметры:
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция ОбновитьТокен(Знач Параметры = "") Экспорт
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Refresh    = "refresh_token";
+    
+    ПараметрыЗапроса = Новый Структура;
+    ПараметрыЗапроса.Вставить(Refresh        , Параметры_[Refresh]);
+    ПараметрыЗапроса.Вставить("grant_type"   , Refresh);
+    ПараметрыЗапроса.Вставить("client_id"    , Параметры_["client_id"]);
+    
+    Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
+    , ПараметрыЗапроса, , Ложь);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// !NOCLI
+// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri
+// Вызывает метод получения токена, так как для получения токена из кода, приходящего
+// на redirect_uri после авторизации через браузер есть всего 30 секунд
+// 
+// Параметры:
+//  Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис
+// 
+// Возвращаемое значение:
+//  HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
+Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт
+    
+    Код         = Запрос.ПараметрыЗапроса["code"];    
+    ОтветТокен  = ПолучитьТокен(Код);
+    
+    // BSLLS:CommentedCode-off
+    // Предпочтительное хранение токенов
+    // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
+    // Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
+    // BSLLS:CommentedCode-on
+    
+    Возврат ОтветТокен;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Твиты
+
+// !NOCLI
+// Создать произвольный твит
+// 
+// Параметры:
+//  Текст - Строка        -  Текст твита
+//  МассивМедиа           -  Массив из Строка,ДвоичныеДанные -  Массив двоичных данных или путей к файлам
+//  МассивВариантовОпроса - Массив из Строка -  Массив вариантов опроса, если необходимо
+//  ДлительностьОпроса    - Строка,Число -  Длительность опроса, если необходимо (опрос без длительности не создается)
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьПроизвольныйТвит(Знач Текст = ""
+    , Знач МассивМедиа = ""
+    , Знач МассивВариантовОпроса = ""
+    , Знач ДлительностьОпроса = ""
+    , Знач Параметры = "") Экспорт 
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ДлительностьОпроса);
+    
+    Если ЗначениеЗаполнено(МассивМедиа) Тогда
+        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивМедиа);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(МассивВариантовОпроса) Тогда
+        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивВариантовОпроса);
+    КонецЕсли;
+    
+    Параметры_         = ПолучитьСтандартныеПараметры(Параметры);
+    URL                = "https://api.twitter.com/2/tweets";
+    Массив             = "Массив";    
+    Поля               = Новый Соответствие;
+    
+    Если ЗначениеЗаполнено(Текст) Тогда
+        Поля.Вставить("text", Текст);
+    КонецЕсли;
+    
+    Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
+        
+        ДлительностьОпроса = Число(ДлительностьОпроса);
+        
+        Если МассивВариантовОпроса.Количество() > 0 Тогда
+        	
+        	СтруктураВарианта = Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса);
+            Поля.Вставить("poll", СтруктураВарианта);
+            
+        КонецЕсли;
+        
+    КонецЕсли;
+    
+    Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда
+        Если МассивМедиа.Количество() > 0 Тогда
+            Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
+        КонецЕсли;
+    КонецЕсли;
+    
+    Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
+    Ответ       = OPI_Инструменты.Post(URL, Поля, Авторизация);
+
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать текстовый твит
+// Создает твит без вложений
+// 
+// Параметры:
+//  Текст      - Строка              - Текст твита                     - text
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
+    Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);    
+КонецФункции
+
+// Создать твит картинки
+// Создает твит с картинкой вложением
+// 
+// Параметры:
+//  Текст          - Строка                          - Текст твита            - text
+//  МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив файлов картинок - pictures
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
+    
+    МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
+    Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);    
+    
+КонецФункции
+
+// Создать твит гифки
+// Создает твит с вложением-гифкой
+// 
+// Параметры:
+//  Текст       - Строка                          - Текст твита         - text
+//  МассивГифок - Массив из Строка,ДвоичныеДанные - Массив файлов гифок - gifs
+//  Параметры   - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
+    
+    МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
+    Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);    
+    
+КонецФункции
+
+// Создать твит видео
+// Создает твит с видеовложением
+// 
+// Параметры:
+//  Текст       - Строка                          - Текст твита         - text
+//  МассивВидео - Массив из Строка,ДвоичныеДанные - Массив файлов видео - videos
+//  Параметры   - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
+    
+    МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
+    Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
+    
+КонецФункции
+
+// Создать твит опрос
+// Создает твит с опросом
+// 
+// Параметры:
+//  Текст           - Строка           - Текст твита               - text
+//  МассивВариантов - Массив из Строка - Массив вариантов опроса   - options
+//  Длительность    - Строка,Число     - Длительность опроса       - duration
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
+    Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);    
+КонецФункции
+
+// Загрузить массив вложений !NOCLI
+// Загружает файлы на сервер и возвращает их ID
+// 
+// Параметры:
+//  МассивФайлов - Массив из Строка, ДвоичныеДанные -  Массив файлов
+//  ТипВложений  - Строка -  Тип вложений
+//  Параметры    - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Массив Из Строка -  Массив ID медиа
+Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ТипВложений);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивФайлов);
+    
+    МассивМедиа = Новый Массив;
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
+    MIS         = "media_id_string";
+    
+    Если ЗначениеЗаполнено(МассивФайлов) Тогда
+                 
+        Для Каждого ФайлОтправки Из МассивФайлов Цикл
+                       
+            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ФайлОтправки);
+            
+            Ответ   = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_);
+            IDМедиа = Ответ[MIS];
+            
+            Если Не ЗначениеЗаполнено(IDМедиа) Тогда
+                Возврат Ответ;
+            КонецЕсли;
+            
+            МассивМедиа.Добавить(IDМедиа);
+            
+        КонецЦикла;
+    
+    КонецЕсли;
+        
+    Возврат МассивМедиа;
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры) 
+   
+    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+   
+    ВидЗапроса = "POST";    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    URL        = "https://upload.twitter.com/1.1/media/upload.json";
+     
+    Если Тип = "tweet_image" Тогда 
+        
+        Поля = Новый Структура;
+        Поля.Вставить("media_data"    , Base64Строка(Файл));
+        Поля.Вставить("media_category", Тип);
+        
+        Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);        
+        Ответ       = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+        
+    Иначе
+        
+        Ответ = ЗагрузитьМедиаЧастями(Файл, Тип, ВидЗапроса, URL, Параметры_);
+        
+    КонецЕсли;
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ЗагрузитьМедиаЧастями(Знач Файл, Знач Тип, Знач ВидЗапроса, Знач URL, Параметры)
+    
+    Единица          = 1024;
+    Количество       = 4;
+    MediaKey         = "media_key";
+    MIS              = "media_id_string";
+    Command          = "command";
+    Размер           = Файл.Размер();
+    
+    СоответствиеMIME = Новый Соответствие;
+    СоответствиеMIME.Вставить("tweet_image", "image/jpeg");
+    СоответствиеMIME.Вставить("tweet_video", "video/mp4");
+    СоответствиеMIME.Вставить("tweet_gif"  , "image/gif");
+    
+    РазмерЧасти  = Количество * Единица * Единица;
+    МассивЧтения = РазделитьДвоичныеДанные(Файл, РазмерЧасти);
+    
+    Поля = Новый Структура;
+    Поля.Вставить(Command          , "INIT");
+    Поля.Вставить("total_bytes"    , OPI_Инструменты.ЧислоВСтроку(Размер));
+    Поля.Вставить("media_type"     , СоответствиеMIME.Получить(Тип));
+    Поля.Вставить("media_category" , Тип);
+    
+    Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL);
+
+    ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+    KeyИнициализации   = ОтветИнициализации[MediaKey];
+    IDИнициализации    = ОтветИнициализации[MIS];
+    
+    Если Не ЗначениеЗаполнено(KeyИнициализации) Или Не ЗначениеЗаполнено(IDИнициализации) Тогда
+        Возврат ОтветИнициализации;     
+    КонецЕсли;
+    
+    Счетчик = 0;
+    
+    Для Каждого Часть Из МассивЧтения Цикл
+        
+        Поля = Новый Структура;
+        Поля.Вставить(Command           , "APPEND");
+        Поля.Вставить("media_key"       , KeyИнициализации);
+        Поля.Вставить("segment_index"   , OPI_Инструменты.ЧислоВСтроку(Счетчик));
+        Поля.Вставить("media"           , Часть);
+
+        Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL);
+        
+        OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
+        
+        Счетчик = Счетчик + 1;
+        
+    КонецЦикла;
+    
+    Поля = Новый Структура;
+    Поля.Вставить(Command   , "FINALIZE");
+    Поля.Вставить("media_id", IDИнициализации);
+    
+    СтатусОбработки = ПолучитьСтатусОбработки(Параметры, Поля, URL);
+    
+    Если Не ТипЗнч(СтатусОбработки) = Тип("Строка") Тогда
+        Возврат СтатусОбработки;
+    КонецЕсли;
+            
+    Ответ = ОжидатьЗавершенияОбработки(СтатусОбработки, IDИнициализации, URL, Параметры);
+    
+    Возврат Ответ;
+        
+КонецФункции
+
+Функция ОжидатьЗавершенияОбработки(Знач СтатусОбработки, Знач IDИнициализации, Знач URL, Знач Параметры)
+    
+    ProcessingInfo   = "processing_info";
+    Command          = "command";
+    Поля             = Новый Структура;
+    
+    Поля.Вставить(Command   , "STATUS");
+    Поля.Вставить("media_id", IDИнициализации);
+
+    Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
+         
+        Авторизация     = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL);        
+        Ответ           = OPI_Инструменты.Get(URL, Поля, Авторизация);     
+        Информация      = Ответ[ProcessingInfo];
+
+        Если Не ЗначениеЗаполнено(Информация) Тогда
+            Возврат Ответ;
+        КонецЕсли;
+        
+        СтатусОбработки = Информация["state"];
+        
+        Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
+            Возврат Ответ;
+        КонецЕсли;
+       
+    КонецЦикла;
+    
+    Если СтатусОбработки = "failed" Тогда
+        ВызватьИсключение "Твиттер не смог обработать загруженное вами видео";
+    КонецЕсли;
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
+    
+    // Здесь собрано определение данных, необходимых для работы.
+    // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API,
+    // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга.
+    // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то,
+    // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести
+    // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать 
+    // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1,
+    // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные
+    
+    // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;)
+    
+    // P.S Далее часто упоминается "страница настроек Twitter Developer" - это 
+    // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем)
+    
+    Параметры_ = Новый Соответствие; 
+    Разрешения = "tweet.read tweet.write tweet.moderate.write users.read "
+        + "follows.read follows.write offline.access space.read mute.read "
+        + "mute.write like.read like.write list.read list.write block.read "
+        + "block.write bookmark.read bookmark.write";    
+               
+    // Данные для API v2
+        
+    // redirect_uri  - URL вашего http-сервиса (или другого обработчика запросов) для авторизации
+    // scope         - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен
+    // client_id     - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
+    // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
+    // access_token  - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code)
+    // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч)
+    //                 Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token. 
+    //                 При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить 
+    //                 не получится (access_token тоже не получится) 
+    
+    //           |--> ОбновитьТокен() ->|access_token  --> Используется в т-нии 2-х часов для запросов
+    //           |                      |refresh_token --|
+    //           |--------[через 2 ч.]-------------------|
+     
+    // Данные для API v1.1
+    
+    // oauth_token           - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer 
+    // oauth_token_secret    - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer
+    // oauth_consumer_key    - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
+    // oauth_consumer_secret - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
+    
+    // Эти токены обновлять не надо
+    
+    Параметры_.Вставить("redirect_uri"         , "");
+    Параметры_.Вставить("scope"                , Разрешения);
+    Параметры_.Вставить("client_id"            , "");
+    Параметры_.Вставить("client_secret"        , "");
+    Параметры_.Вставить("access_token"         , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить()
+    Параметры_.Вставить("refresh_token"        , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить()
+    Параметры_.Вставить("oauth_token"          , "");
+    Параметры_.Вставить("oauth_token_secret"   , "");
+    Параметры_.Вставить("oauth_consumer_key"   , "");
+    Параметры_.Вставить("oauth_consumer_secret", "");
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
+    
+    Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
+        Для Каждого ПереданныйПараметр Из Параметры Цикл
+            Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
+        КонецЦикла;
+    КонецЕсли;
+
+    Возврат Параметры_;
+
+КонецФункции
+
+Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL)
+    
+    ТекущаяДата          = OPI_Инструменты.ПолучитьТекущуюДату();
+    ЗаголовокАвторизации = "";
+    МетодХэширования     = "HMAC-SHA1";
+    ВерсияАпи            = "1.0";
+    СтрокаСигнатуры      = "";
+    Подпись              = "";
+    OCK                  = "oauth_consumer_key";
+    OTK                  = "oauth_token";
+    ТекущаяДатаUNIX      = OPI_Инструменты.UNIXTime(ТекущаяДата);
+    ТекущаяДатаUNIX      = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
+    ТаблицаПараметров    = Новый ТаблицаЗначений;
+    ТаблицаПараметров.Колонки.Добавить("Ключ");
+    ТаблицаПараметров.Колонки.Добавить("Значение");
+        
+    Для Каждого Поле Из Поля Цикл 
+        
+        НоваяСтрока = ТаблицаПараметров.Добавить();    
+        НоваяСтрока.Ключ     = Поле.Ключ;
+        НоваяСтрока.Значение = Поле.Значение;
+        
+    КонецЦикла;
+    
+    НоваяСтрока = ТаблицаПараметров.Добавить();
+    НоваяСтрока.Ключ     = OCK;
+    НоваяСтрока.Значение = Параметры[OCK];
+    
+    НоваяСтрока = ТаблицаПараметров.Добавить();
+    НоваяСтрока.Ключ     = OTK;
+    НоваяСтрока.Значение = Параметры[OTK];
+    
+    НоваяСтрока = ТаблицаПараметров.Добавить();
+    НоваяСтрока.Ключ     = "oauth_version";
+    НоваяСтрока.Значение = ВерсияАпи;
+    
+    НоваяСтрока = ТаблицаПараметров.Добавить();
+    НоваяСтрока.Ключ     = "oauth_signature_method";
+    НоваяСтрока.Значение = МетодХэширования;
+
+    НоваяСтрока = ТаблицаПараметров.Добавить();
+    НоваяСтрока.Ключ     = "oauth_timestamp";
+    НоваяСтрока.Значение = ТекущаяДатаUNIX;
+
+    НоваяСтрока = ТаблицаПараметров.Добавить();
+    НоваяСтрока.Ключ     = "oauth_nonce";
+    НоваяСтрока.Значение = ТекущаяДатаUNIX;
+
+    Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
+        
+        СтрокаТаблицы.Ключ     = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL);
+        СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL);
+        
+    КонецЦикла;
+    
+    ТаблицаПараметров.Сортировать("Ключ");
+    
+    Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
+        
+        СтрокаСигнатуры = СтрокаСигнатуры 
+            + СтрокаТаблицы.Ключ 
+            + "="
+            + СтрокаТаблицы.Значение
+            + "&";
+            
+    КонецЦикла;
+    
+    СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
+    СтрокаСигнатуры = вРег(ВидЗапроса) 
+        + "&" 
+        + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL)
+        + "&"
+        + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
+        
+    Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL)
+        + "&" 
+        + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL);
+             
+    Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись)
+        , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры)
+        , ХешФункция.SHA1
+        , 64);
+        
+    Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
+    
+    Разделитель          = """,";
+    ЗаголовокАвторизации = ЗаголовокАвторизации 
+        + "OAuth "
+        + "oauth_consumer_key="""      + Параметры[OCK]        + Разделитель
+        + "oauth_token="""             + Параметры[OTK]        + Разделитель
+        + "oauth_signature_method="""  + МетодХэширования      + Разделитель
+        + "oauth_timestamp="""         + ТекущаяДатаUNIX       + Разделитель
+        + "oauth_nonce="""             + ТекущаяДатаUNIX       + Разделитель
+        + "oauth_version="""           + ВерсияАпи             + Разделитель
+        + "oauth_signature="""         + Сигнатура;
+        
+        СоответствиеЗаголовка = Новый Соответствие;
+        СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации);
+        
+    Возврат СоответствиеЗаголовка;
+        
+КонецФункции
+
+Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры)
+    
+    СоответствиеВозврата = Новый Соответствие;
+    СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
+    
+    Возврат СоответствиеВозврата;
+    
+КонецФункции
+
+Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL)
+
+	ProcessingInfo   = "processing_info";
+    Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL);
+    
+    Ответ      = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);  
+    Информация = Ответ[ProcessingInfo];
+    
+    Если Не ЗначениеЗаполнено(Информация) Тогда
+    	Возврат Ответ;
+    КонецЕсли;
+    
+    СтатусОбработки = Информация["state"];
+    
+    Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
+    	Возврат Ответ;
+    Иначе
+    	Возврат СтатусОбработки;
+    КонецЕсли;	
+    
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_VK.os b/src/ru/OInt/core/Modules/OPI_VK.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_VK.os
rename to src/ru/OInt/core/Modules/OPI_VK.os
index deab0f9880..067ed51ce6 100644
--- a/ru/OInt/core/Modules/OPI_VK.os
+++ b/src/ru/OInt/core/Modules/OPI_VK.os
@@ -1,2190 +1,2190 @@
-// Расположение OS: ./OInt/core/Modules/OPI_VK.os
-// Библиотека: VK
-// Команда CLI: vk
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.        
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
-// и почитать комментарии
-
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:UsingServiceTag-off
-// BSLLS:UnusedLocalVariable-off
-
-//@skip-check method-too-many-params
-//@skip-check wrong-string-literal-content
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область ПолучениеТокена
-
-// Создать ссылку получения токена
-// Получение ссылки для интерактивного получения токена (access_token), который необходим
-// для дальнейших действий
-// 
-// Параметры:
-//  app_id - Строка,Число - app_id из настроек приложения - app
-// 
-// Возвращаемое значение:
-//  Строка - URL, по которому необходимо перейти в браузере 
-Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id);
-    
-    // access_token нужно будет забрать из параметра в строке адреса браузера
-    Возврат "https://oauth.vk.com/authorize?client_id=" + App_id
-        + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video"
-        + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html";
-        
-КонецФункции
- 
-#КонецОбласти
-
-#Область РаботаСГруппой
-
-// Создать пост
-// Создает пост с картинками
-// 
-// Параметры:
-//  Текст              - Строка                          - Текст поста                           - text
-//  МассивКартинок     - Массив из Строка,ДвоичныеДанные - Массив картинок                       - pictures  
-//  Реклама            - Булево                          - Признак ""Это реклама""               - ad
-//  СсылкаПодЗаписью   - Строка                          - Ссылка (URL) под записью              - url
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьПост(Знач Текст
-    , Знач МассивКартинок
-    , Знач Реклама = Ложь
-    , Знач СсылкаПодЗаписью = ""
-    , Знач Параметры = "") Экспорт
-        
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок);
- 
-    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
-    МассивВложений  = Новый Массив;    
-        
-    Для Каждого КартинкаПоста Из МассивКартинок Цикл
-        
-        Параметры_        = ПолучитьСтандартныеПараметры(Параметры);
-        ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост");
-        
-        OwnerId  = ОтветСоответствие.Получить("owner_id");
-        ObjectId = ОтветСоответствие.Получить("id");
-        
-        Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
-        	Возврат ОтветСоответствие;
-        КонецЕсли;
-        
-        OwnerId  = OPI_Инструменты.ЧислоВСтроку(OwnerId);
-        ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId);
-        
-        ФотоID = "photo" + OwnerId + "_" + ObjectId; 
-
-        МассивВложений.Добавить(ФотоID);
-        
-    КонецЦикла;
-
-    Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать составной пост
-// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.)
-// 
-// Параметры:
-//  Текст            - Строка           - Текст поста                              - text
-//  Объекты          - Массив из Строка - Массив идентификаторов вида photo123_123 - objects  
-//  Реклама          - Булево           - Признак ""Это реклама""                  - ad
-//  СсылкаПодЗаписью - Строка           - Ссылка (URL) под записью                 - url
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьСоставнойПост(Знач Текст
-    , Знач Объекты
-    , Знач Реклама = Ложь
-    , Знач СсылкаПодЗаписью = ""
-    , Знач Параметры = "") Экспорт
-   
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью);   
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама);
-    
-    Параметры      = ПолучитьСтандартныеПараметры(Параметры);
-    СтрокаВложений = СтрСоединить(Объекты, ",");   
-    СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью;
-    
-    Параметры.Вставить("message"            , Текст);
-    Параметры.Вставить("attachments"        , СтрокаВложений);
-    Параметры.Вставить("mark_as_ads"        , ?(Реклама, 1, 0));
-    Параметры.Вставить("close_comments"     , ?(Реклама, 1, 0));
-
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры);
-    
-    Возврат Ответ;
-     
-КонецФункции
-
-// Удалить пост
-// Удаляет пост по id
-//
-// Параметры:
-//  IDПоста    - Строка,Число - ID поста - post
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
-    Параметры_.Вставить("post_id", IDПоста);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать опрос
-// Создает опрос с вариантами ответа
-//
-// Параметры:
-//  Вопрос        - Строка                - Вопрос опроса              - question
-//  МассивОтветов - Массив из Строка      - Массив вариантов ответа    - options
-//  Картинка      - Строка,ДвоичныеДанные - Картинка опроса            - picture
-//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
-    
-    Параметры_    = ПолучитьСтандартныеПараметры(Параметры);
-    Response      = "response";
-
-    Если ЗначениеЗаполнено(Картинка) Тогда
-        
-        Ответ  = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос");
-        
-        Фото   = Ответ.Получить(Response);
-        
-        Если ЗначениеЗаполнено(Фото) Тогда
-        	
-        	IDФото = Фото["id"];
-        	
-        	Если Не ЗначениеЗаполнено(IDФото) Тогда
-            	Возврат Ответ;
-        	КонецЕсли;
-        	
-        Иначе
-            Возврат Ответ;
-        КонецЕсли;
-    
-    КонецЕсли;
-    
-    Параметры_.Вставить("is_anonymous", 1);
-    Параметры_.Вставить("is_multiple" , 0);
-        
-    Ответы = СтрСоединить(МассивОтветов, """,""");
-    Ответы = "[""" + Ответы + """]";    
-        
-    Параметры_.Вставить("add_answers", Ответы);
-    Параметры_.Вставить("photo_id"   , OPI_Инструменты.ЧислоВСтроку(IDФото));
-    Параметры_.Вставить("question"   , Вопрос);
-    
-    Опрос             = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_);
-    ОпросСоответствие = Опрос.Получить(Response);
-    
-    Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда
-    	Возврат Опрос;
-    КонецЕсли;
-    
-    OwnerId  = ОпросСоответствие.Получить("owner_id");
-    ObjectId = ОпросСоответствие.Получить("id");
-    
-    Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
-        Возврат Опрос;
-    КонецЕсли;
-    
-    ОпросID = "poll"
-    + OPI_Инструменты.ЧислоВСтроку(OwnerId)
-    + "_" 
-    + OPI_Инструменты.ЧислоВСтроку(ObjectId);
- 
-    Параметры_.Вставить("attachments", ОпросID);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать альбом
-// Создает альбом для хранения картинок
-//
-// Параметры:
-//  Наименование - Строка - Наименование альбома - title
-//  Описание     - Строка - Описание альбома     - description
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    
-    Параметры_.Вставить("title"                , Наименование);
-    Параметры_.Вставить("description"          , Описание);
-    Параметры_.Вставить("upload_by_admins_only", 1);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить альбом
-// Удаляет ранее созданный альбом
-//
-// Параметры:
-//  IDАльбома - Строка,Число        - ID альбома - album
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
-    Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома));
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать историю
-// Создает историю из картинки
-//
-// Параметры:
-//  Картинка     - Строка,ДвоичныеДанные - Фон истории                           - picture
-//  URL          - Строка                - URL для кнопки под историей           - url
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("link_text"  , "more");
-    Параметры_.Вставить("link_url"   , URL);
-    Параметры_.Вставить("add_to_news", "1");
-    
-    Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История");    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Сохранить картинку в альбом
-// Сохраняет картинку в альбом сообщества
-//
-// Параметры:
-//  IDАльбома - Строка,Число          - ID альбома        - album                           
-//  Картинка  - ДвоичныеДанные,Строка - Файл картинки     - picture
-//  Описание  - Строка                - Описание картинки - description
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-    
-    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
-    
-    Параметры_.Вставить("album_id", IDАльбома);
-    Параметры_.Вставить("caption" , Описание);
-          
-    Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом");
-    
-КонецФункции
-
-// Удалить картинку
-// Удалить картинку из альбома
-//
-// Параметры:
-//  IDКартинки - Строка,Число       - ID картинки - pictureid 
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки);
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("photo_id", IDКартинки);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Загрузить видео на сервер
-// Загружает видео в группу с возможностью его дальнейшего использования
-// 
-// Параметры:
-//  Видео        - Строка, ДвоичныеДанные - Файл видео                  - file
-//  Наименование - Строка                 - Наименование видео          - title
-//  Описание     - Строка                 - Описание видео              - description
-//  Альбом       - Строка                 - ID альбома, если необходимо - album
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
-Функция ЗагрузитьВидеоНаСервер(Знач Видео
-    , Знач Наименование
-    , Знач Описание = ""
-    , Знач Альбом = ""
-    , Знач Параметры = "") Экспорт
-	
-	Строка_   = "Строка";
-	Параметры = ПолучитьСтандартныеПараметры(Параметры);
-	
-	OPI_Инструменты.ДобавитьПоле("name"       , Наименование, Строка_, Параметры);
-	OPI_Инструменты.ДобавитьПоле("description", Описание    , Строка_, Параметры);
-	OPI_Инструменты.ДобавитьПоле("album_id"   , Альбом      , Строка_, Параметры);
-	
-	Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры);
-    
-    Результат = Ответ["response"];
-    
-    Если Не ЗначениеЗаполнено(Результат) Тогда
-		Возврат Ответ;
-    КонецЕсли;
-    
-	URL = Результат["upload_url"];
-	
-	Если Не ЗначениеЗаполнено(URL) Тогда
-		Возврат Ответ;
-	КонецЕсли;
-    
-    СоответствиеФайлов = Новый Соответствие;
-    OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов);
-    
-    РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер();
-    РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных);
-    
-    Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4");
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Загрузить фото на сервер
-// Загружает фото на сервер для его дальнейшего использования
-// 
-// Параметры:
-//  Картинка  - Строка, ДвоичныеДанные - Файл картинки                   - file
-//  Параметры - Структура из Строка    - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//  Вид       - Строка                 - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
-Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт
-       
-    Параметры  = ПолучитьСтандартныеПараметры(Параметры);
-    Метод      = ОпределитьМетодЗагрузкиИзображений(Вид);
-    Файлы      = Новый Соответствие;
-    
-    Response   = "response";
-    URL        = "api.vk.com/method/";
-    Загрузка   = URL + Метод["Загрузка"];
-    Сохранение = URL + Метод["Сохранение"];
-    
-    Если ТипЗнч(Картинка) = Тип("Строка") Тогда
-        КлючКартинка        = СтрЗаменить(Картинка, ".", "___");
-        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
-    Иначе
-        КлючКартинка        = "image___jpeg";
-    КонецЕсли;
-    
-    Файлы.Вставить(КлючКартинка, Картинка);
-    
-    Для Н = 1 По 5 Цикл
-        
-        Ответ     = OPI_Инструменты.Get(Загрузка, Параметры);  
-        Результат = Ответ[Response];
-        
-        Если ЗначениеЗаполнено(Результат) Тогда
-            
-            URL = Результат["upload_url"];
-            
-            Если Не ЗначениеЗаполнено(URL) Тогда
-                Возврат Ответ;
-            КонецЕсли;
-            
-        Иначе
-            Возврат Ответ;
-        КонецЕсли;
-        
-        Параметры.Вставить("upload_url", URL);
-        Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы);
-        
-        Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда
-            Прервать;
-        КонецЕсли;
-        
-    КонецЦикла;
-    
-    Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда
-        Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ);
-    КонецЕсли;
-
-    ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры);
-        
-    Ответ = OPI_Инструменты.Get(Сохранение, Параметры);
-          
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСОбсуждениями
-
-// Создать обсуждение
-// Создает новое обсуждение
-//
-// Параметры:
-//  Наименование          - Строка  - Наименование обсуждения - title
-//  ТекстПервогоСообщения - Строка  - Текст первого сообщения - text
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("title", Наименование);
-    Параметры_.Вставить("text" , ТекстПервогоСообщения);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Закрыть обсуждение
-// Закрывает или удаляет обсуждение
-//
-// Параметры:
-//  IDОбсуждения     - Строка,Число - ID обсуждения                                          - topic
-//  УдалитьПолностью - Булево       -  Удалить полностью (Истина) или закрыть                - remove
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью);
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("topic_id", IDОбсуждения);
-    
-    Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic");   
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Открыть обсуждение
-// Открывает ранее закрытое обсуждение
-//
-// Параметры:
-//  IDОбсуждения - Строка,Число - ID обсуждения - topic
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("topic_id", IDОбсуждения);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Написать в обсуждение
-// Добавляет сообщение в обсуждение от имени группы
-//
-// Параметры:
-//  IDОбсуждения - Строка,Число - ID обсуждения   - topic
-//  Текст        - Строка       - Текст сообщения - text
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("topic_id", IDОбсуждения);
-    Параметры_.Вставить("message" , Текст);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область ИнтерактивныеДействия
-
-// Поставить лайк
-// Ставит лайк на пост
-//
-// Параметры:
-//  IDПоста   - Строка,Число - ID поста                    - post
-//  IDСтены   - Строка,Число - ID стены расположения поста - wall
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
-    
-    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
-    IDСтены         = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]);
-    ОбъектВК        = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста);
-    
-    Параметры_.Вставить("type"        , "post");
-    Параметры_.Вставить("object"      , ОбъектВК);
-    Параметры_.Вставить("item_id"     , OPI_Инструменты.ЧислоВСтроку(IDПоста));
-    Параметры_.Вставить("owner_id"    , OPI_Инструменты.ЧислоВСтроку(IDСтены));
-    Параметры_.Вставить("from_group"  , 0);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Сделать репост
-// Делает репост записи
-//
-// Параметры:
-//  IDПоста      - Строка,Число - ID поста                      - post
-//  IDСтены      - Строка,Число -  ID стены расположения поста  - from
-//  ЦелеваяСтена - Строка,Число -  ID целевой стены или группы  - to
-//  Рекламный    - Булево -  Признак рекламного поста           - ad
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СделатьРепост(Знач IDПоста
-    , Знач IDСтены = ""
-    , Знач ЦелеваяСтена = ""
-    , Знач Рекламный = Ложь
-    , Знач Параметры = "") Экспорт
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    GroupId    = Параметры_["group_id"];
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный);
-       
-    Источник    = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId);       
-    Приемник    = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId);
-
-    Параметры_.Вставить("object"          , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
-    Параметры_.Вставить("group_id"        , СтрЗаменить(Приемник, "-", ""));
-    Параметры_.Вставить("mark_as_ads"     , ?(Рекламный, 1, 0));
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Написать сообщение
-// Написать сообщение пользователю в диалоге сообщества
-//
-// Параметры:
-//  Текст          - Строка - Текст сообщения                                                 - text
-//  IDПользователя - Строка - ID пользователя адресата                                        - user
-//  Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках  - ct
-//  Клавиатура     - Строка - JSON клавиатуры. См.СформироватьКлавиатуру                      - keyboard
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция НаписатьСообщение(Знач Текст
-    , Знач IDПользователя
-    , Знач Communitytoken
-    , Знач Клавиатура = ""
-    , Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура);
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("access_token", Communitytoken);
-    
-    Параметры_.Вставить("user_id"     , IDПользователя);
-    Параметры_.Вставить("peer_id"     , IDПользователя);
-    Параметры_.Вставить("parse_mode"  , "Markdown"); 
-    Параметры_.Вставить("random_id"   , 0);
-    Параметры_.Вставить("message"     , Текст);
-    
-    Если ЗначениеЗаполнено(Клавиатура) Тогда
-        Параметры_.Вставить("keyboard", Клавиатура);
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Написать комментарий
-// Создает комментарий под выбранной записью
-//
-// Параметры:
-//  IDПоста   - Строка,Число - ID целевого поста            - post
-//  IDСтены   - Строка,Число -  ID стены расположения поста - wall
-//  Текст     - Строка       - Текст комментария            - text
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт
-
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    GroupId    = Параметры_["group_id"];
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-       
-    Параметры_.Вставить("owner_id"   , IDСтены); 
-    Параметры_.Вставить("from_group" , GroupId);
-    Параметры_.Вставить("post_id"    , IDПоста);
-    Параметры_.Вставить("message"    , Текст);
-    
-    Параметры_.Удалить("group_id");
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Сократить ссылку
-// Создает сокращенный URL из обычного
-//
-// Параметры:
-//  URL       - Строка - URL для сокращения - url
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-// Строка - Сокращенный URL 
-Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
-    
-    Response   = "response";
-    Параметры_ = Новый Структура;
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);    
-    Параметры_.Вставить("url", URL);
-    
-    Ответ     = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_);
-    Результат = Ответ[Response];
-    
-    Если ЗначениеЗаполнено(Результат) Тогда
-    	
-    	URL = Результат["short_url"];
-    	
-    	Если ЗначениеЗаполнено(URL) Тогда
-    		Возврат URL;
-    	Иначе
-    		Возврат Ответ;
-    	КонецЕсли;
-    	
-    Иначе
-    	Возврат Ответ;
-    КонецЕсли;
-      
-КонецФункции
-
-#КонецОбласти
-
-#Область Статистика
-
-// Получить статистику
-// Получает общую статистику сообщества за период
-//
-// Параметры:
-//  ДатаНачала    - Дата - Дата начала периода    - datefrom
-//  ДатаОкончания - Дата - Дата окончания периода - dateto
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала);
-    OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания);
-    
-    Параметры_         = ПолучитьСтандартныеПараметры(Параметры);
-    
-    ДатаНачала         = OPI_Инструменты.UNIXTime(ДатаНачала);
-    ДатаОкончания      = OPI_Инструменты.UNIXTime(ДатаОкончания);
-    
-    Параметры_.Вставить("timestamp_from", ДатаНачала);
-    Параметры_.Вставить("timestamp_to"  , ДатаОкончания);
-    Параметры_.Вставить("stats_groups"  , "visitors, reach, activity");
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить статистику по постам
-// Получает статистику в разрезе постов
-//
-// Параметры:
-//  МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Массив из Произвольный -  Массив данных статистики по постам
-Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов);
-    
-    Параметры_       = ПолучитьСтандартныеПараметры(Параметры);
-    МассивОтветов    = Новый Массив;
-    МассивНабора     = Новый Массив;
-    МаксимумПостов   = 30;
-    Response         = "response";
-    
-    Для Каждого Пост Из МассивИДПостов Цикл
-        
-        МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост));
-        
-        Если МассивНабора.Количество() = МаксимумПостов Тогда
-            
-            СтрокаНомеров = СтрСоединить(МассивНабора, ",");
-            Параметры_.Вставить("post_ids", СтрокаНомеров);
-            
-            Статистика             = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
-            МассивСтатистики       = Статистика[Response];
-            
-            Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
-                МассивОтветов.Добавить(ЭлементСтатистики);
-            КонецЦикла;
-            
-            МассивНабора = Новый Массив;
-            
-        КонецЕсли;
-        
-    КонецЦикла;
-    
-    СтрокаНомеров = СтрСоединить(МассивНабора, ",");
-    Параметры_.Вставить("post_ids", СтрокаНомеров);
-    
-    Статистика       = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
-    МассивСтатистики = Статистика[Response];
-    
-    Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда
-        Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
-            МассивОтветов.Добавить(ЭлементСтатистики);
-        КонецЦикла;
-    КонецЕсли;
-
-    Возврат МассивОтветов;
-    
-КонецФункции
-        
-#КонецОбласти
-
-#Область РаботаСРекламнымКабинетом
-
-// Создать рекламную кампанию
-// Создает кампанию в выбранном рекламном кабинете
-//
-// Параметры:
-//  IDКабинета   - Строка,Число - ID рекламного кабинета - cabinet
-//  Наименование - Строка       - Наименование кампании - title
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-    
-    ТекущаяДата  = OPI_Инструменты.ПолучитьТекущуюДату();
-    КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24);
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
-    Параметры_.Вставить("account_id", IDКабинета);
-    
-    МассивСтруктур = Новый Массив;
-    ДатаСтарт      = OPI_Инструменты.UNIXTime(ТекущаяДата);
-    ДатаСтоп       = OPI_Инструменты.UNIXTime(КонечнаяДата);
-    
-    СтруктураКампании = Новый Структура;
-    СтруктураКампании.Вставить("type"            , "promoted_posts");
-    СтруктураКампании.Вставить("name"            , Наименование);
-    СтруктураКампании.Вставить("day_limit"       , 0);
-    СтруктураКампании.Вставить("all_limit"       , 0);
-    СтруктураКампании.Вставить("start_time"      , ДатаСтарт);
-    СтруктураКампании.Вставить("stop_time"       , ДатаСтоп);
-    СтруктураКампании.Вставить("status"          , 1);
-    
-    МассивСтруктур.Добавить(СтруктураКампании);
-    
-    JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
-    
-    Параметры_.Вставить("data", JSONДата);
-    
-    Ответ    = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать рекламное объявление
-// Создает рекламное объявление на основе поста
-//
-// Параметры:
-//  НомерКампании  - Строка,Число - ID рекламной кампании                         - campaign
-//  ДневнойЛимит   - Строка,Число - Дневной лимит в рублях                        - limit
-//  НомерКатегории - Строка,Число - Номер рекламной категории                     - category
-//  IDПоста        - Строка,Число - ID поста, используемого в качетсве рекламы    - post
-//  IDКабинета     - Строка,Число - ID рекламного кабинета                        - cabinet
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьРекламноеОбъявление(Знач НомерКампании
-    , Знач ДневнойЛимит
-    , Знач НомерКатегории
-    , Знач IDПоста
-    , Знач IDКабинета
-    , Знач Параметры = "") Экспорт
-    
-    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);   
-    GroupId     = Параметры_["group_id"];
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
-    
-    Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста;
-    
-    МассивСтруктур        = Новый Массив;    
-    СтруктураКампании     = Новый Структура;
-    СтруктураКампании.Вставить("campaign_id"                , НомерКампании);
-    СтруктураКампании.Вставить("ad_format"                  , 9);
-    СтруктураКампании.Вставить("conversion_event_id"        , 1);
-    СтруктураКампании.Вставить("autobidding"                , 1);
-    СтруктураКампании.Вставить("cost_type"                  , 3);
-    СтруктураКампании.Вставить("goal_type"                  , 2);
-    СтруктураКампании.Вставить("ad_platform"                , "all");
-    СтруктураКампании.Вставить("publisher_platforms"        , "vk");
-    СтруктураКампании.Вставить("publisher_platforms_auto"   , "1");
-    СтруктураКампании.Вставить("day_limit"                  , ДневнойЛимит);
-    СтруктураКампании.Вставить("all_limit"                  , "0");
-    СтруктураКампании.Вставить("category1_id"               , НомерКатегории);
-    СтруктураКампании.Вставить("age_restriction"            , 0);
-    СтруктураКампании.Вставить("status"                     , 1);
-    СтруктураКампании.Вставить("name"                       , "Объявление");
-    СтруктураКампании.Вставить("link_url"                   , Линк);
-    
-    МассивСтруктур.Добавить(СтруктураКампании);
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
-    
-    Параметры_.Вставить("data"        , МассивСтруктур);
-    Параметры_.Вставить("account_id"  , IDКабинета);
-    
-    Ответ    = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Приостановить рекламное объявление
-// Приостанавливает показ рекламного объявления
-//
-// Параметры:
-//  IDКабинета   - Строка,Число - ID рекламного кабинета - cabinet
-//  IDОбъявления - Строка,Число - ID объявления          - adv 
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
-    Параметры_.Вставить("account_id", IDКабинета);
-    
-    МассивСтруктур    = Новый Массив;    
-    СтруктураКампании = Новый Структура;
-    
-    СтруктураКампании.Вставить("ad_id"  , IDОбъявления);
-    СтруктураКампании.Вставить("status" , 0);
-    
-    МассивСтруктур.Добавить(СтруктураКампании);
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
-    
-    Параметры_.Вставить("data", МассивСтруктур);
-        
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить список рекламных категорий
-// Получает список id рекламных категорий для создания рекламного объявления
-//
-// Параметры:
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Ответ      = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСТоварами
-
-// Получить список категорий товаров
-// Получает список ID товарных категорий для указания при создании товара
-//
-// Параметры:
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из Строка - Ключ - ID, Значение - Имя
-Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт
-    
-    Response   = "response";
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
-    Результат  = Ответ[Response];
-    
-    Если ЗначениеЗаполнено(Результат) Тогда
-    	
-    	Количество = Результат["count"];
-    	
-    	Если Не ЗначениеЗаполнено(Количество) Тогда
-    		Возврат Ответ;
-    	КонецЕсли;
-    	
-    Иначе
-    	Возврат Ответ;
-    КонецЕсли;
-    
-    Параметры_.Вставить("count", Количество);
-    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);   
-    Результат  = Ответ[Response]; 
-    
-    Если ЗначениеЗаполнено(Результат) Тогда
-    	
-    	Категории  = Результат["items"];
-    	
-    	Если Не ЗначениеЗаполнено(Категории) Тогда
-    		Возврат Ответ;
-    	КонецЕсли;
-    	
-    Иначе
-    	Возврат Ответ;
-    КонецЕсли;
-       
-    СоответствиеКатегорий = Новый Соответствие;
-    
-    Для Каждого Категория Из Категории Цикл      
-        СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]);
-    КонецЦикла;
-       
-    Возврат СоответствиеКатегорий;
-    
-КонецФункции
-
-// Получить список товаров
-// Получает список товаров сообщества
-//
-// Параметры:
-//  Подборка  - Строка,Число        - ID подборки, если нужен отбор - sel
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Массив соответствий товаров
-Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("count"        , 200);
-    Параметры_.Вставить("extended"     , 1);
-    Параметры_.Вставить("with_disabled", 1);
-    
-    Если ЗначениеЗаполнено(Подборка) Тогда
-        Параметры_.Вставить("album_id", Подборка);  
-    КонецЕсли;
-    
-    МассивТоваров = Новый Массив;
-    ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_);
-    
-    Возврат МассивТоваров;
-    
-КонецФункции
-
-// Получить товары по ID
-// Получает информацию о товарах по массиву ID
-//
-// Параметры:
-//  Товары    - Строка, Массив Из Строка - Массив ID товаров - items 
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары);
-    
-    Параметры_    = ПолучитьСтандартныеПараметры(Параметры);
-    СтрокаТоваров = "";
-    Owner         = "owner_id";
-    
-    Для Каждого Товар Из Товары Цикл       
-        ТекущийТовар  = Параметры_[Owner] + "_" + Товар;
-        ТекущийТовар  = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар);
-        СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ",";
-    КонецЦикла;
-    
-    СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1);
-    Параметры_.Вставить("item_ids", СтрокаТоваров);
-    Параметры_.Вставить("extended", 1);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_);
-    
-    Возврат Ответ;
-     
-КонецФункции
-
-// Добавить товар
-// Добавляет новый товар в каталог сообщества
-//
-// Параметры:
-//  ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
-//  Подборка       - Строка - ID подборка для помещения товара, если необходимо - sel
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт        
-    Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры);    
-КонецФункции
-
-// Изменить товар
-// Изменяет ранее созданный товар
-//
-// Параметры:
-//  Товар - Число,Строка - Идентификатор изменяемого товара - item
-//  ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
-//  Подборка - Строка - Идентификатор новой подборки, если необходимо - sel 
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт
-    Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры);    
-КонецФункции
-
-// Удалить товар
-// Удаляет ранее созданный товар
-//
-// Параметры:
-//  Товар - Строка,Число - ID товара - item
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("item_id", Товар);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Сгруппировать товары
-// Группирует товары на основе одинаковых наборов свойств
-//
-// Параметры:
-//  МассивТоваров      - Массив Из Строка - Массив ID товаров                       - items
-//  СуществующаяГруппа - Строка           - ID существующей группы, если необходимо - sellgroup
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
-    
-    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);
-    МассивТоваров_ = Новый Массив;
-    
-    Для Каждого Товар Из МассивТоваров Цикл
-        МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));
-    КонецЦикла;
-    
-    Товары = СтрСоединить(МассивТоваров_, ",");
-    
-    Параметры_.Вставить("item_ids", Товары);
-    
-    Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда
-        Параметры_.Вставить("item_group_id", СуществующаяГруппа);
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить описание товара. !NOCLI
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Пустое описание товара:
-//  *Имя - Строка - Имя товара
-//  *Описание - Строка - Описание товара
-//  *Категория - Строка - См. ПолучитьСписокКатегорийТоваров
-//  *Цена - Число - Цена товара
-//  *СтараяЦена - Число - Для отображения скидки/изменения цены
-//  *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото
-//  *URL - Строка - Ссылка на страницу сайта магазина
-//  *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото
-//  *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара
-//  *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе
-//  *Ширина - Число - Ширина товара в мм.
-//  *Высота - Число - Высота товара в мм.
-//  *Глубина - Число - Глубина товара в мм.
-//  *Вес - Число - Вес в гр.
-//  *SKU - Строка - SKU
-//  *ДоступныйОстаток - Число - Остаток. -1 - не ограничено
-Функция ПолучитьОписаниеТовара() Экспорт
-     
-    Товар = Новый Соответствие();
-    Товар.Вставить("Имя"                , "Новый товар");     // Имя товара
-    Товар.Вставить("Описание"           , "Описание товара"); // Описание товара
-    Товар.Вставить("Категория"          , "20173");           // См ПолучитьСписокКатегорийТоваров()
-    Товар.Вставить("Цена"               , 1);                 // Цена.
-    Товар.Вставить("СтараяЦена"         , Неопределено);      // Для отражения изменения цены 
-    Товар.Вставить("ОсновноеФото"       , Неопределено);      // ДД или путь к осн. фото
-    Товар.Вставить("URL"                , Неопределено);      // Ссылка на страницу магазина
-    Товар.Вставить("ДополнительныеФото" , Новый Массив);      // Массив путей или ДД для доп. фото
-    Товар.Вставить("ЗначенияСвойств"    , Новый Массив);      // Значения свойств (варианты). Максимум 2
-    Товар.Вставить("ГлавныйВГруппе"     , Ложь);              // Сделать главным в своей группе  
-    Товар.Вставить("Ширина"             , Неопределено);      // В миллиметрах
-    Товар.Вставить("Высота"             , Неопределено);      // В миллиметрах
-    Товар.Вставить("Глубина"            , Неопределено);      // В миллиметрах
-    Товар.Вставить("Вес"                , Неопределено);      // В граммах
-    Товар.Вставить("SKU"                , Неопределено);      // Артикул
-    Товар.Вставить("ДоступныйОстаток"   , 1);
-    
-    Возврат Товар;
-     
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСПодборкамиТоваров
-
-// Получить список подборок
-// Получает список подборок товаров
-//
-// Параметры:
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - Массив соответствий подборок
-Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("count", 100);
-    
-    МассивАльбомов = Новый Массив;
-    ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_);
-    
-    Возврат МассивАльбомов;
-    
-КонецФункции
-
-// Получить подборки по ID
-// Получить список подборок по массиву ID
-//
-// Параметры:
-//  Подборки  - Строка, Массив Из Строка - ID подборок - sels
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки);
-    
-    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);    
-    Подборки_      = Новый Массив;
-    СтрокаПодборок = "";
-      
-    Для Каждого Подборка Из Подборки Цикл
-        Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка));    
-    КонецЦикла;    
-    
-    СтрокаПодборок = СтрСоединить(Подборки_, ",");
-        
-    Параметры_.Вставить("album_ids", СтрокаПодборок);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_);
-    
-    Возврат Ответ;
-     
-КонецФункции
-
-// Создать подборку товаров
-// Создает пустую подборку товаров
-//
-// Параметры:
-//  Название  - Строка                - Название подборки - title
-//  Картинка  - Строка,ДвоичныеДанные - Файл картинки     - picture
-//  Основная  - Булево                - Основная          - main
-//  Скрытая   - Булево                - Скрытая           - hidden
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьПодборкуТоваров(Знач Название
-    , Знач Картинка
-    , Знач Основная = Ложь
-    , Знач Скрытая = Ложь
-    , Знач Параметры = "") Экспорт
-    
-    Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры);
-    
-КонецФункции
-
-// Изменить подборку товаров
-// Изменяет свойства подборки товаров
-//
-// Параметры:
-//  Название - Строка                - Новое название подборки         - title
-//  Подборка - Строка                - ID подборки					   - sel
-//  Картинка - Строка,ДвоичныеДанные - Новая картинка подборки         - picture
-//  Основная - Булево                - Основная                        - main
-//  Скрытая  - Булево                - Скрытая                         - hidden
-//  Параметры - Структура из Строка  - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ИзменитьПодборкуТоваров(Знач Название
-    , Знач Подборка
-    , Знач Картинка = ""
-    , Знач Основная = Ложь
-    , Знач Скрытая = Ложь
-    , Знач Параметры = "") Экспорт
-    
-    Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры);
-    
-КонецФункции
-
-// Добавить товар в подборку
-// Добавляет товар в подборку
-//
-// Параметры:
-//  МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items
-//  Подборка      - Строка                  - ID подборки              - sel
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-    
-    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);
-    МассивТоваров_ = Новый Массив;
-      
-    Для Каждого Товар Из МассивТоваров Цикл
-        МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));    
-    КонецЦикла;    
-    
-    СписокТоваров = СтрСоединить(МассивТоваров_, ",");
-    
-    Параметры_.Вставить("item_ids" , СписокТоваров);
-    Параметры_.Вставить("album_ids", Подборка);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить товар из подборки
-// Удаляет ранее добавленный товар из подборки
-// 
-// Параметры:
-//  Товар     - Строка - ID товара   - item
-//  Подборка  - Строка - ID подборки - sel
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-
-    Параметры_   = ПолучитьСтандартныеПараметры(Параметры);
-    
-    Параметры_.Вставить("item_id"  , Товар);
-    Параметры_.Вставить("album_ids", Подборка);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить подборку
-// Удаляет подборку по ID
-//
-// Параметры:
-//  Подборка  - Строка              - ID подборки - sel
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("album_id", Подборка);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСоСвойствамиТоваров
-
-// Получить список свойств
-// Получает список свойств товаров группы
-// 
-// Параметры:
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
-Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт
-    
-    Response   = "response";
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    
-    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_);
-    Свойства   = Ответ[Response]["items"];
-    
-    Возврат Свойства;
-    
-КонецФункции
-
-// Создать свойство товара
-// Создает новое свойство для использования в товарах
-// 
-// Параметры:
-//  Название  - Строка              - Название свойства               - title
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
-Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("title", Название);
-        
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_);   
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Изменить свойство товара
-// Изменяет существующее свойство товара
-// 
-// Параметры:
-//  Название  - Строка              - Новое название                  - title
-//  Свойство  - Строка,Число        - ID свойства                     - prop
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
-Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("title"      , Название);
-    Параметры_.Вставить("property_id", Свойство);
-    Параметры_.Вставить("type"       , "text");
-        
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_);   
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Удалить свойство товара
-// Удаляет существующее свойство товара
-// 
-// Параметры:
-//  Свойство  - Строка,Число        - ID свойства                     - prop
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
-Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("property_id", Свойство);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Добавить вариант свойства товара
-// Добавляет вариант для существующего свойства
-// 
-// Параметры:
-//  Значение  - Строка              - Значение свойства                      - value
-//  Свойство  - Строка,Число        - ID свойства, куда добавляется вариант  - prop
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK    
-Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("property_id", Свойство);
-    Параметры_.Вставить("title"      , Значение);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Изменить вариант свойства товара
-// Изменяет значение варианта существующего свойства товара
-// 
-// Параметры:
-//  Значение  - Строка              - Новое значение свойства         - value
-//  Свойство  - Строка,Число        - ID свойства                     - prop
-//  Вариант   - Строка,Число        - ID варианта                     - option
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK      
-Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("property_id", Свойство);
-    Параметры_.Вставить("variant_id" , Вариант);
-    Параметры_.Вставить("title"      , Значение);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Удалить вариант свойства товара
-// Удаляет ранее созданный вариант свойства
-// 
-// Параметры:
-//  Вариант   - Строка,Число        - ID варианта - option
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK     
-Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("variant_id", Вариант);
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСЗаказами
-
-// Получить список заказов
-// Возвращает список заказов сообщества
-// 
-// Параметры:
-//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
-Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт
-    
-    Параметры = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры.Вставить("count", 50);
-    
-    МассивЗаказов = Новый Массив;
-    ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры);
-    
-    Возврат МассивЗаказов;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область Прочие
-
-// Сформировать клавиатуру
-// Формирует клавиатуру по массиву кнопок
-// 
-// Параметры:
-//  МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons
-// 
-// Возвращаемое значение:
-//  Строка -  JSON клавиатуры
-Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт
-      
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);  
-    
-    Клавиатура          = Новый Структура;
-    МассивКлавиатуры    = Новый Массив;
-    МассивБлока         = Новый Массив;
-    
-    Для Каждого Действие Из МассивКнопок Цикл
-        
-        Кнопка      = Новый Структура;
-        Выражение   = Новый Структура;                        
-        
-        Выражение.Вставить("type" , "text");
-        Выражение.Вставить("label", Действие);
-        
-        Кнопка.Вставить("action", Выражение);
-        МассивБлока.Добавить(Кнопка);
-        
-    КонецЦикла;
-    
-    МассивКлавиатуры.Добавить(МассивБлока);
-    
-    Клавиатура.Вставить("buttons" , МассивКлавиатуры);   
-    Клавиатура.Вставить("one_time", Ложь);
-    
-    Возврат OPI_Инструменты.JSONСтрокой(Клавиатура);
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
-    
-    // Здесь собрано определение данных для работы с VK API
-    // Вы можете переопределять их, передавая в качестве параметра
-    // Совпадающие поля будут перезаписаны с приоритетом параметра функции
-    
-    Параметры_ = Новый Структура;
-    
-    // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
-    // from_group   - действия будут выполняться от лица группы
-    // owner_id     - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
-    //               установлен свой
-    // app_id       - id приложения, которое необходимо создать в профиле на странице для разработчиков
-    // group_id     - owner_id, но без "-"
-    
-    Параметры_.Вставить("access_token"  , "");
-    Параметры_.Вставить("from_group"    , "1");
-    Параметры_.Вставить("owner_id"      , "");
-    Параметры_.Вставить("v"             , "5.131");
-    Параметры_.Вставить("app_id"        , "");
-    Параметры_.Вставить("group_id"      , "");
-    
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
-    
-    Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
-        Для Каждого ПереданныйПараметр Из Параметры Цикл
-            Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
-        КонецЦикла;
-    КонецЕсли;
-
-    Возврат Параметры_;
-
-КонецФункции
-
-Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид)
-	
-	Response  = "response";
-    Ответ     = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);
-    Результат = Ответ[Response];
-
-    Если ЗначениеЗаполнено(Результат) Тогда
-    	ИДФото = Результат["photo_id"];
-    	
-    	Если Не ЗначениеЗаполнено(ИДФото) Тогда
-    		Возврат Ответ;	
-    	КонецЕсли;
-    	
-    Иначе
-    	Возврат Ответ;
-    КонецЕсли;
-    
-    ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
-    Возврат ИДФото;
-    
-КонецФункции
-
-Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид)
-	
-	Ответ       = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);   
-    ОтветМассив = Ответ.Получить("response");
-    
-    Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда
-    	Возврат Ответ;
-    Иначе
-    	Если ОтветМассив.Количество() = 0 Тогда
-    		Возврат Ответ;
-    	Иначе
-    		ОтветСоответствие = ОтветМассив[0];
-    	КонецЕсли;
-    КонецЕсли;
-     
-    Возврат ОтветСоответствие;
-       
-КонецФункции
-
-Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "")
-	
-	Response   = "response";
-	Подборки   = ПолучитьПодборкиПоИД(Подборки, Параметры);
-    Результат  = Подборки[Response];
-    
-    Если ЗначениеЗаполнено(Результат) Тогда
-    	
-    	МассивПодборок = Результат["items"];
-    	
-    	Если Не ЗначениеЗаполнено(МассивПодборок) Тогда
-    		Возврат Подборки;	
-    	КонецЕсли;
-    	
-	Иначе
-		Возврат Подборки;
-    КонецЕсли;
-    
-    Возврат МассивПодборок;
-            
-КонецФункции
-
-Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид)
-    
-    СоответствиеМетодов = Новый Соответствие;
-    Загрузка            = "Загрузка";
-    Сохранение          = "Сохранение";
-    Способ              = "Способ";
-    Фото                = "Фото";
-    
-    Если Вид = "Пост" Тогда
-       
-        СоответствиеМетодов.Вставить(Загрузка  , "photos.getWallUploadServer");
-        СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto");
-        СоответствиеМетодов.Вставить(Фото      , "photo");
-        СоответствиеМетодов.Вставить(Способ    , 1);
-        
-    ИначеЕсли Вид = "Товар" Тогда
-        
-        СоответствиеМетодов.Вставить(Загрузка  , "market.getProductPhotoUploadServer");
-        СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto");
-        СоответствиеМетодов.Вставить(Способ    , 2);
-        
-    ИначеЕсли Вид = "История" Тогда
-        
-        СоответствиеМетодов.Вставить(Загрузка  , "stories.getPhotoUploadServer");
-        СоответствиеМетодов.Вставить(Сохранение, "stories.save");
-        СоответствиеМетодов.Вставить(Способ    , 3);
-    
-    ИначеЕсли Вид = "Опрос" Тогда
-        
-        СоответствиеМетодов.Вставить(Загрузка  , "polls.getPhotoUploadServer");
-        СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto");
-        СоответствиеМетодов.Вставить(Фото      , "photo");
-        СоответствиеМетодов.Вставить(Способ    , 1);
-        
-    Иначе
-        
-        СоответствиеМетодов.Вставить(Загрузка  , "photos.getUploadServer");
-        СоответствиеМетодов.Вставить(Сохранение, "photos.save");
-        СоответствиеМетодов.Вставить(Фото      , "photos_list");
-        СоответствиеМетодов.Вставить(Способ    , 1);
-        
-    КонецЕсли;
-    
-    Возврат СоответствиеМетодов;
-    
-КонецФункции
-
-Функция ПолучитьСоответствиеПараметровТовара()
-    
-    Поля = Новый Соответствие();
-    Поля.Вставить("Имя"                , "name");     
-    Поля.Вставить("Описание"           , "description"); 
-    Поля.Вставить("Категория"          , "category_id");                 
-    Поля.Вставить("Цена"               , "price");                 
-    Поля.Вставить("СтараяЦена"         , "old_price");  
-    Поля.Вставить("URL"                , "url");
-    Поля.Вставить("ГлавныйВГруппе"     , "is_main_variant"); 
-    Поля.Вставить("Ширина"             , "dimension_width");      
-    Поля.Вставить("Высота"             , "dimension_height");      
-    Поля.Вставить("Глубина"            , "dimension_length");      
-    Поля.Вставить("Вес"                , "weight");      
-    Поля.Вставить("SKU"                , "sku"); 
-    Поля.Вставить("ДоступныйОстаток"   , "stock_amount");
-       
-    Возврат Поля;
-
-КонецФункции
-
-Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "")
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-    Параметры_.Вставить("v", "5.199");
-    
-    Response = "response";
-    
-    ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_);
-    
-    Если ЗначениеЗаполнено(ИДТовара) Тогда       
-        Параметры_.Вставить("item_id", ИДТовара);
-        Метод = "edit";    
-    Иначе       
-        Метод = "add";
-    КонецЕсли;
-       
-    Ответ     = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
-    Результат = Ответ[Response];
-    
-    Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда 
-    	
-        ИДТовара = Результат["market_item_id"];
-        
-        Если Не ЗначениеЗаполнено(ИДТовара) Тогда
-        	Возврат Ответ;	
-        КонецЕсли;
-        
-    Иначе
-    	Возврат Ответ;
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда
-        ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_);
-    КонецЕсли;
-    
-    Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеПодборкой(Знач Название
-    , Знач Картинка   = ""
-    , Знач ИДПодборки = ""
-    , Знач Основная   = Ложь
-    , Знач Скрытая    = Ложь
-    , Знач Параметры  = "")
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Основная);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая);
-    
-    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);   
-    Ответ      = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_);
-    
-    Если ЗначениеЗаполнено(Ответ) Тогда
-        Возврат Ответ;
-    КонецЕсли;
-      
-    Параметры_.Вставить("title"        , Название);
-    Параметры_.Вставить("main_album"   , ?(Основная, 1, 0));
-    Параметры_.Вставить("is_hidden"    , ?(Скрытая, 1, 0));
-    
-    Если ЗначениеЗаполнено(ИДПодборки) Тогда       
-        Параметры_.Вставить("album_id", ИДПодборки);
-        Метод = "editAlbum";    
-    Иначе       
-        Метод = "addAlbum";
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры)
-    
-    PhotoID = "photo_id";
-    
-    Если ЗначениеЗаполнено(Картинка) Тогда
-        
-        ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар");
-        
-        Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
-            Возврат ИДФото; 
-        КонецЕсли;
-      
-        Параметры.Вставить(PhotoID, ИДФото);
-        
-    Иначе
-        
-        Если ЗначениеЗаполнено(ИДПодборки) Тогда
-            
-            Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры);
-            
-            Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда
-                Возврат Подборки;   
-            КонецЕсли;
-                                
-            Если Не Подборки.Количество() = 0 Тогда              
-                ИДФото = Подборки[0]["photo"]["id"];
-                OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото);
-                Параметры.Вставить(PhotoID, ИДФото);
-            КонецЕсли;
-            
-        КонецЕсли;
-        
-    КонецЕсли;
-    
-    Возврат "";
-    
-КонецФункции
-
-Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры)
-    
-    Response            = "response";
-    Способ              = Метод["Способ"];
-    СтандартныйСпособ   = 1;
-    НовыйСпособ         = 2;
-
-    Если Способ = СтандартныйСпособ Тогда
-        
-        Hash       = "hash";
-        Serv       = "server";
-        Aid        = "aid";
-        Фото       = Метод["Фото"];
-        
-        Параметры.Вставить(Hash, Ответ[Hash]);
-        Параметры.Вставить(Фото, Ответ[Фото]);
-        
-        СерверФото = Ответ.Получить(Serv);
-               
-        Если ЗначениеЗаполнено(СерверФото) Тогда
-            СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото);
-            Параметры.Вставить(Serv, СерверФото);      
-        КонецЕсли;
-        
-        Идентификатор = Ответ.Получить(Aid);
-               
-        Если ЗначениеЗаполнено(Идентификатор) Тогда
-            Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор);
-            Параметры.Вставить(Aid , Идентификатор);      
-        КонецЕсли;
-        
-    ИначеЕсли Способ = НовыйСпособ Тогда
-        
-        ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ);
-        Параметры.Вставить("upload_response", ОтветСтрокой);
-        
-    Иначе
-        
-        Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]);
-        
-    КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры)
-    
-    Response     = "response";
-    ОсновноеФото = ОписаниеТовара["ОсновноеФото"];
-    ДопФото      = ОписаниеТовара["ДополнительныеФото"];
-    Свойства     = ОписаниеТовара["ЗначенияСвойств"];
-    
-    Если ЗначениеЗаполнено(ОсновноеФото) Тогда
-    	
-        Ответ     = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар");
-        Результат = Ответ[Response];
-        
-        Если ЗначениеЗаполнено(Результат) Тогда
-        	ИДФото = Результат["photo_id"];
-        	
-        	Если Не ЗначениеЗаполнено(ИДФото) Тогда
-        		Возврат;	
-        	КонецЕсли;
-        	
-        Иначе
-        	Возврат;
-        КонецЕсли;
-        
-        ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
-        Параметры.Вставить("main_photo_id", ИДФото); 
-         
-    КонецЕсли;
-    
-    Если ТипЗнч(Свойства) = Тип("Массив") Тогда  
-        
-        Свойства_ = Новый Массив;
-        
-        Для Каждого Свойство Из Свойства Цикл
-            Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство));   
-        КонецЦикла;
-        
-        Свойства = СтрСоединить(Свойства_, ","); 
-        
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Свойства) Тогда
-        Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства));    
-    КонецЕсли;
-    
-    ДобавитьДополнительныеФотоТовара(ДопФото, Параметры);
-    
-    Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл
-        
-        Значение = ОписаниеТовара[Поле.Ключ];
-        
-        Если Значение <> Неопределено Тогда
-            Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]);
-        КонецЕсли;
-        
-    КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ДобавитьДополнительныеФотоТовара(Знач МассивФото, Параметры)
-    
-    Если ТипЗнч(МассивФото) = Тип("Массив") Тогда
-        Если МассивФото.Количество() > 0 Тогда
-            
-            СтрокаФотографий = "";
-            
-            Для Каждого Фото Из МассивФото Цикл
-                
-                ИДФото = ПолучитьИДКартинки(Фото, Параметры, "Товар");
-                
-		        Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
-		    		Возврат;	
-		    	КонецЕсли;
-
-                СтрокаФотографий = СтрокаФотографий + ИДФото + ","; 
-                
-            КонецЦикла;
-            
-            СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1);
-            Параметры.Вставить("photo_ids", СтрокаФотографий);
-        КонецЕсли;
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0)
-    
-    Response         = "response";
-    МаксимумВЗапросе = 200;
-    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры);
-    Товары           = Ответ[Response]["items"];
-    
-    Если Товары.Количество() = 0 Тогда
-        Возврат;
-    КонецЕсли;      
-    
-    Для Каждого Товар Из Товары Цикл
-        МассивТоваров.Добавить(Товар);
-    КонецЦикла;
-       
-    Сдвиг = Сдвиг + МаксимумВЗапросе;
-    Параметры.Вставить("offset", Сдвиг);
-    ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг);
-    
-КонецПроцедуры
-
-Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0)
-    
-    Response         = "response";
-    МаксимумВЗапросе = 100;
-    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры);
-    Альбомы          = Ответ[Response]["items"];
-    
-    Если Альбомы.Количество() = 0 Тогда
-        Возврат;
-    КонецЕсли;      
-    
-    Для Каждого Альбом Из Альбомы Цикл
-        МассивАльбомов.Добавить(Альбом);
-    КонецЦикла;
-       
-    Сдвиг = Сдвиг + МаксимумВЗапросе;
-    Параметры.Вставить("offset", Сдвиг);
-    ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг);
-    
-КонецПроцедуры
-
-Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0)
-    
-    Response         = "response";
-    МаксимумВЗапросе = 50;
-    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры);
-    Заказы           = Ответ[Response]["items"];
-    
-    Если Заказы.Количество() = 0 Тогда
-        Возврат;
-    КонецЕсли;      
-    
-    Для Каждого Заказ Из Заказы Цикл
-        МассивЗаказов.Добавить(Заказ);
-    КонецЦикла;
-       
-    Сдвиг = Сдвиг + МаксимумВЗапросе;
-    Параметры.Вставить("offset", Сдвиг);
-    ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг);
-    
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_VK.os
+// Библиотека: VK
+// Команда CLI: vk
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.        
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
+// и почитать комментарии
+
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+// BSLLS:UnusedLocalVariable-off
+
+//@skip-check method-too-many-params
+//@skip-check wrong-string-literal-content
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область ПолучениеТокена
+
+// Создать ссылку получения токена
+// Получение ссылки для интерактивного получения токена (access_token), который необходим
+// для дальнейших действий
+// 
+// Параметры:
+//  app_id - Строка,Число - app_id из настроек приложения - app
+// 
+// Возвращаемое значение:
+//  Строка - URL, по которому необходимо перейти в браузере 
+Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id);
+    
+    // access_token нужно будет забрать из параметра в строке адреса браузера
+    Возврат "https://oauth.vk.com/authorize?client_id=" + App_id
+        + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video"
+        + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html";
+        
+КонецФункции
+ 
+#КонецОбласти
+
+#Область РаботаСГруппой
+
+// Создать пост
+// Создает пост с картинками
+// 
+// Параметры:
+//  Текст              - Строка                          - Текст поста                           - text
+//  МассивКартинок     - Массив из Строка,ДвоичныеДанные - Массив картинок                       - pictures  
+//  Реклама            - Булево                          - Признак ""Это реклама""               - ad
+//  СсылкаПодЗаписью   - Строка                          - Ссылка (URL) под записью              - url
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьПост(Знач Текст
+    , Знач МассивКартинок
+    , Знач Реклама = Ложь
+    , Знач СсылкаПодЗаписью = ""
+    , Знач Параметры = "") Экспорт
+        
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок);
+ 
+    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
+    МассивВложений  = Новый Массив;    
+        
+    Для Каждого КартинкаПоста Из МассивКартинок Цикл
+        
+        Параметры_        = ПолучитьСтандартныеПараметры(Параметры);
+        ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост");
+        
+        OwnerId  = ОтветСоответствие.Получить("owner_id");
+        ObjectId = ОтветСоответствие.Получить("id");
+        
+        Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
+        	Возврат ОтветСоответствие;
+        КонецЕсли;
+        
+        OwnerId  = OPI_Инструменты.ЧислоВСтроку(OwnerId);
+        ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId);
+        
+        ФотоID = "photo" + OwnerId + "_" + ObjectId; 
+
+        МассивВложений.Добавить(ФотоID);
+        
+    КонецЦикла;
+
+    Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать составной пост
+// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.)
+// 
+// Параметры:
+//  Текст            - Строка           - Текст поста                              - text
+//  Объекты          - Массив из Строка - Массив идентификаторов вида photo123_123 - objects  
+//  Реклама          - Булево           - Признак ""Это реклама""                  - ad
+//  СсылкаПодЗаписью - Строка           - Ссылка (URL) под записью                 - url
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьСоставнойПост(Знач Текст
+    , Знач Объекты
+    , Знач Реклама = Ложь
+    , Знач СсылкаПодЗаписью = ""
+    , Знач Параметры = "") Экспорт
+   
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью);   
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама);
+    
+    Параметры      = ПолучитьСтандартныеПараметры(Параметры);
+    СтрокаВложений = СтрСоединить(Объекты, ",");   
+    СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью;
+    
+    Параметры.Вставить("message"            , Текст);
+    Параметры.Вставить("attachments"        , СтрокаВложений);
+    Параметры.Вставить("mark_as_ads"        , ?(Реклама, 1, 0));
+    Параметры.Вставить("close_comments"     , ?(Реклама, 1, 0));
+
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры);
+    
+    Возврат Ответ;
+     
+КонецФункции
+
+// Удалить пост
+// Удаляет пост по id
+//
+// Параметры:
+//  IDПоста    - Строка,Число - ID поста - post
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
+    Параметры_.Вставить("post_id", IDПоста);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать опрос
+// Создает опрос с вариантами ответа
+//
+// Параметры:
+//  Вопрос        - Строка                - Вопрос опроса              - question
+//  МассивОтветов - Массив из Строка      - Массив вариантов ответа    - options
+//  Картинка      - Строка,ДвоичныеДанные - Картинка опроса            - picture
+//  Параметры  - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
+    
+    Параметры_    = ПолучитьСтандартныеПараметры(Параметры);
+    Response      = "response";
+
+    Если ЗначениеЗаполнено(Картинка) Тогда
+        
+        Ответ  = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос");
+        
+        Фото   = Ответ.Получить(Response);
+        
+        Если ЗначениеЗаполнено(Фото) Тогда
+        	
+        	IDФото = Фото["id"];
+        	
+        	Если Не ЗначениеЗаполнено(IDФото) Тогда
+            	Возврат Ответ;
+        	КонецЕсли;
+        	
+        Иначе
+            Возврат Ответ;
+        КонецЕсли;
+    
+    КонецЕсли;
+    
+    Параметры_.Вставить("is_anonymous", 1);
+    Параметры_.Вставить("is_multiple" , 0);
+        
+    Ответы = СтрСоединить(МассивОтветов, """,""");
+    Ответы = "[""" + Ответы + """]";    
+        
+    Параметры_.Вставить("add_answers", Ответы);
+    Параметры_.Вставить("photo_id"   , OPI_Инструменты.ЧислоВСтроку(IDФото));
+    Параметры_.Вставить("question"   , Вопрос);
+    
+    Опрос             = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_);
+    ОпросСоответствие = Опрос.Получить(Response);
+    
+    Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда
+    	Возврат Опрос;
+    КонецЕсли;
+    
+    OwnerId  = ОпросСоответствие.Получить("owner_id");
+    ObjectId = ОпросСоответствие.Получить("id");
+    
+    Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
+        Возврат Опрос;
+    КонецЕсли;
+    
+    ОпросID = "poll"
+    + OPI_Инструменты.ЧислоВСтроку(OwnerId)
+    + "_" 
+    + OPI_Инструменты.ЧислоВСтроку(ObjectId);
+ 
+    Параметры_.Вставить("attachments", ОпросID);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать альбом
+// Создает альбом для хранения картинок
+//
+// Параметры:
+//  Наименование - Строка - Наименование альбома - title
+//  Описание     - Строка - Описание альбома     - description
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    
+    Параметры_.Вставить("title"                , Наименование);
+    Параметры_.Вставить("description"          , Описание);
+    Параметры_.Вставить("upload_by_admins_only", 1);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить альбом
+// Удаляет ранее созданный альбом
+//
+// Параметры:
+//  IDАльбома - Строка,Число        - ID альбома - album
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
+    Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома));
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать историю
+// Создает историю из картинки
+//
+// Параметры:
+//  Картинка     - Строка,ДвоичныеДанные - Фон истории                           - picture
+//  URL          - Строка                - URL для кнопки под историей           - url
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("link_text"  , "more");
+    Параметры_.Вставить("link_url"   , URL);
+    Параметры_.Вставить("add_to_news", "1");
+    
+    Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История");    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Сохранить картинку в альбом
+// Сохраняет картинку в альбом сообщества
+//
+// Параметры:
+//  IDАльбома - Строка,Число          - ID альбома        - album                           
+//  Картинка  - ДвоичныеДанные,Строка - Файл картинки     - picture
+//  Описание  - Строка                - Описание картинки - description
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+    
+    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
+    
+    Параметры_.Вставить("album_id", IDАльбома);
+    Параметры_.Вставить("caption" , Описание);
+          
+    Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом");
+    
+КонецФункции
+
+// Удалить картинку
+// Удалить картинку из альбома
+//
+// Параметры:
+//  IDКартинки - Строка,Число       - ID картинки - pictureid 
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки);
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("photo_id", IDКартинки);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Загрузить видео на сервер
+// Загружает видео в группу с возможностью его дальнейшего использования
+// 
+// Параметры:
+//  Видео        - Строка, ДвоичныеДанные - Файл видео                  - file
+//  Наименование - Строка                 - Наименование видео          - title
+//  Описание     - Строка                 - Описание видео              - description
+//  Альбом       - Строка                 - ID альбома, если необходимо - album
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
+Функция ЗагрузитьВидеоНаСервер(Знач Видео
+    , Знач Наименование
+    , Знач Описание = ""
+    , Знач Альбом = ""
+    , Знач Параметры = "") Экспорт
+	
+	Строка_   = "Строка";
+	Параметры = ПолучитьСтандартныеПараметры(Параметры);
+	
+	OPI_Инструменты.ДобавитьПоле("name"       , Наименование, Строка_, Параметры);
+	OPI_Инструменты.ДобавитьПоле("description", Описание    , Строка_, Параметры);
+	OPI_Инструменты.ДобавитьПоле("album_id"   , Альбом      , Строка_, Параметры);
+	
+	Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры);
+    
+    Результат = Ответ["response"];
+    
+    Если Не ЗначениеЗаполнено(Результат) Тогда
+		Возврат Ответ;
+    КонецЕсли;
+    
+	URL = Результат["upload_url"];
+	
+	Если Не ЗначениеЗаполнено(URL) Тогда
+		Возврат Ответ;
+	КонецЕсли;
+    
+    СоответствиеФайлов = Новый Соответствие;
+    OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов);
+    
+    РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер();
+    РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных);
+    
+    Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4");
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Загрузить фото на сервер
+// Загружает фото на сервер для его дальнейшего использования
+// 
+// Параметры:
+//  Картинка  - Строка, ДвоичныеДанные - Файл картинки                   - file
+//  Параметры - Структура из Строка    - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//  Вид       - Строка                 - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
+Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт
+       
+    Параметры  = ПолучитьСтандартныеПараметры(Параметры);
+    Метод      = ОпределитьМетодЗагрузкиИзображений(Вид);
+    Файлы      = Новый Соответствие;
+    
+    Response   = "response";
+    URL        = "api.vk.com/method/";
+    Загрузка   = URL + Метод["Загрузка"];
+    Сохранение = URL + Метод["Сохранение"];
+    
+    Если ТипЗнч(Картинка) = Тип("Строка") Тогда
+        КлючКартинка        = СтрЗаменить(Картинка, ".", "___");
+        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
+    Иначе
+        КлючКартинка        = "image___jpeg";
+    КонецЕсли;
+    
+    Файлы.Вставить(КлючКартинка, Картинка);
+    
+    Для Н = 1 По 5 Цикл
+        
+        Ответ     = OPI_Инструменты.Get(Загрузка, Параметры);  
+        Результат = Ответ[Response];
+        
+        Если ЗначениеЗаполнено(Результат) Тогда
+            
+            URL = Результат["upload_url"];
+            
+            Если Не ЗначениеЗаполнено(URL) Тогда
+                Возврат Ответ;
+            КонецЕсли;
+            
+        Иначе
+            Возврат Ответ;
+        КонецЕсли;
+        
+        Параметры.Вставить("upload_url", URL);
+        Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы);
+        
+        Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда
+            Прервать;
+        КонецЕсли;
+        
+    КонецЦикла;
+    
+    Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда
+        Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ);
+    КонецЕсли;
+
+    ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры);
+        
+    Ответ = OPI_Инструменты.Get(Сохранение, Параметры);
+          
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСОбсуждениями
+
+// Создать обсуждение
+// Создает новое обсуждение
+//
+// Параметры:
+//  Наименование          - Строка  - Наименование обсуждения - title
+//  ТекстПервогоСообщения - Строка  - Текст первого сообщения - text
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("title", Наименование);
+    Параметры_.Вставить("text" , ТекстПервогоСообщения);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Закрыть обсуждение
+// Закрывает или удаляет обсуждение
+//
+// Параметры:
+//  IDОбсуждения     - Строка,Число - ID обсуждения                                          - topic
+//  УдалитьПолностью - Булево       -  Удалить полностью (Истина) или закрыть                - remove
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью);
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("topic_id", IDОбсуждения);
+    
+    Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic");   
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Открыть обсуждение
+// Открывает ранее закрытое обсуждение
+//
+// Параметры:
+//  IDОбсуждения - Строка,Число - ID обсуждения - topic
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("topic_id", IDОбсуждения);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Написать в обсуждение
+// Добавляет сообщение в обсуждение от имени группы
+//
+// Параметры:
+//  IDОбсуждения - Строка,Число - ID обсуждения   - topic
+//  Текст        - Строка       - Текст сообщения - text
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("topic_id", IDОбсуждения);
+    Параметры_.Вставить("message" , Текст);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ИнтерактивныеДействия
+
+// Поставить лайк
+// Ставит лайк на пост
+//
+// Параметры:
+//  IDПоста   - Строка,Число - ID поста                    - post
+//  IDСтены   - Строка,Число - ID стены расположения поста - wall
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
+    
+    Параметры_      = ПолучитьСтандартныеПараметры(Параметры);
+    IDСтены         = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]);
+    ОбъектВК        = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста);
+    
+    Параметры_.Вставить("type"        , "post");
+    Параметры_.Вставить("object"      , ОбъектВК);
+    Параметры_.Вставить("item_id"     , OPI_Инструменты.ЧислоВСтроку(IDПоста));
+    Параметры_.Вставить("owner_id"    , OPI_Инструменты.ЧислоВСтроку(IDСтены));
+    Параметры_.Вставить("from_group"  , 0);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Сделать репост
+// Делает репост записи
+//
+// Параметры:
+//  IDПоста      - Строка,Число - ID поста                      - post
+//  IDСтены      - Строка,Число -  ID стены расположения поста  - from
+//  ЦелеваяСтена - Строка,Число -  ID целевой стены или группы  - to
+//  Рекламный    - Булево -  Признак рекламного поста           - ad
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СделатьРепост(Знач IDПоста
+    , Знач IDСтены = ""
+    , Знач ЦелеваяСтена = ""
+    , Знач Рекламный = Ложь
+    , Знач Параметры = "") Экспорт
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    GroupId    = Параметры_["group_id"];
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный);
+       
+    Источник    = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId);       
+    Приемник    = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId);
+
+    Параметры_.Вставить("object"          , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
+    Параметры_.Вставить("group_id"        , СтрЗаменить(Приемник, "-", ""));
+    Параметры_.Вставить("mark_as_ads"     , ?(Рекламный, 1, 0));
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Написать сообщение
+// Написать сообщение пользователю в диалоге сообщества
+//
+// Параметры:
+//  Текст          - Строка - Текст сообщения                                                 - text
+//  IDПользователя - Строка - ID пользователя адресата                                        - user
+//  Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках  - ct
+//  Клавиатура     - Строка - JSON клавиатуры. См.СформироватьКлавиатуру                      - keyboard
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция НаписатьСообщение(Знач Текст
+    , Знач IDПользователя
+    , Знач Communitytoken
+    , Знач Клавиатура = ""
+    , Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура);
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("access_token", Communitytoken);
+    
+    Параметры_.Вставить("user_id"     , IDПользователя);
+    Параметры_.Вставить("peer_id"     , IDПользователя);
+    Параметры_.Вставить("parse_mode"  , "Markdown"); 
+    Параметры_.Вставить("random_id"   , 0);
+    Параметры_.Вставить("message"     , Текст);
+    
+    Если ЗначениеЗаполнено(Клавиатура) Тогда
+        Параметры_.Вставить("keyboard", Клавиатура);
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Написать комментарий
+// Создает комментарий под выбранной записью
+//
+// Параметры:
+//  IDПоста   - Строка,Число - ID целевого поста            - post
+//  IDСтены   - Строка,Число -  ID стены расположения поста - wall
+//  Текст     - Строка       - Текст комментария            - text
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт
+
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    GroupId    = Параметры_["group_id"];
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+       
+    Параметры_.Вставить("owner_id"   , IDСтены); 
+    Параметры_.Вставить("from_group" , GroupId);
+    Параметры_.Вставить("post_id"    , IDПоста);
+    Параметры_.Вставить("message"    , Текст);
+    
+    Параметры_.Удалить("group_id");
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Сократить ссылку
+// Создает сокращенный URL из обычного
+//
+// Параметры:
+//  URL       - Строка - URL для сокращения - url
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+// Строка - Сокращенный URL 
+Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+    
+    Response   = "response";
+    Параметры_ = Новый Структура;
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);    
+    Параметры_.Вставить("url", URL);
+    
+    Ответ     = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_);
+    Результат = Ответ[Response];
+    
+    Если ЗначениеЗаполнено(Результат) Тогда
+    	
+    	URL = Результат["short_url"];
+    	
+    	Если ЗначениеЗаполнено(URL) Тогда
+    		Возврат URL;
+    	Иначе
+    		Возврат Ответ;
+    	КонецЕсли;
+    	
+    Иначе
+    	Возврат Ответ;
+    КонецЕсли;
+      
+КонецФункции
+
+#КонецОбласти
+
+#Область Статистика
+
+// Получить статистику
+// Получает общую статистику сообщества за период
+//
+// Параметры:
+//  ДатаНачала    - Дата - Дата начала периода    - datefrom
+//  ДатаОкончания - Дата - Дата окончания периода - dateto
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала);
+    OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания);
+    
+    Параметры_         = ПолучитьСтандартныеПараметры(Параметры);
+    
+    ДатаНачала         = OPI_Инструменты.UNIXTime(ДатаНачала);
+    ДатаОкончания      = OPI_Инструменты.UNIXTime(ДатаОкончания);
+    
+    Параметры_.Вставить("timestamp_from", ДатаНачала);
+    Параметры_.Вставить("timestamp_to"  , ДатаОкончания);
+    Параметры_.Вставить("stats_groups"  , "visitors, reach, activity");
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить статистику по постам
+// Получает статистику в разрезе постов
+//
+// Параметры:
+//  МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Массив из Произвольный -  Массив данных статистики по постам
+Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов);
+    
+    Параметры_       = ПолучитьСтандартныеПараметры(Параметры);
+    МассивОтветов    = Новый Массив;
+    МассивНабора     = Новый Массив;
+    МаксимумПостов   = 30;
+    Response         = "response";
+    
+    Для Каждого Пост Из МассивИДПостов Цикл
+        
+        МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост));
+        
+        Если МассивНабора.Количество() = МаксимумПостов Тогда
+            
+            СтрокаНомеров = СтрСоединить(МассивНабора, ",");
+            Параметры_.Вставить("post_ids", СтрокаНомеров);
+            
+            Статистика             = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
+            МассивСтатистики       = Статистика[Response];
+            
+            Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
+                МассивОтветов.Добавить(ЭлементСтатистики);
+            КонецЦикла;
+            
+            МассивНабора = Новый Массив;
+            
+        КонецЕсли;
+        
+    КонецЦикла;
+    
+    СтрокаНомеров = СтрСоединить(МассивНабора, ",");
+    Параметры_.Вставить("post_ids", СтрокаНомеров);
+    
+    Статистика       = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
+    МассивСтатистики = Статистика[Response];
+    
+    Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда
+        Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
+            МассивОтветов.Добавить(ЭлементСтатистики);
+        КонецЦикла;
+    КонецЕсли;
+
+    Возврат МассивОтветов;
+    
+КонецФункции
+        
+#КонецОбласти
+
+#Область РаботаСРекламнымКабинетом
+
+// Создать рекламную кампанию
+// Создает кампанию в выбранном рекламном кабинете
+//
+// Параметры:
+//  IDКабинета   - Строка,Число - ID рекламного кабинета - cabinet
+//  Наименование - Строка       - Наименование кампании - title
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+    
+    ТекущаяДата  = OPI_Инструменты.ПолучитьТекущуюДату();
+    КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24);
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);    
+    Параметры_.Вставить("account_id", IDКабинета);
+    
+    МассивСтруктур = Новый Массив;
+    ДатаСтарт      = OPI_Инструменты.UNIXTime(ТекущаяДата);
+    ДатаСтоп       = OPI_Инструменты.UNIXTime(КонечнаяДата);
+    
+    СтруктураКампании = Новый Структура;
+    СтруктураКампании.Вставить("type"            , "promoted_posts");
+    СтруктураКампании.Вставить("name"            , Наименование);
+    СтруктураКампании.Вставить("day_limit"       , 0);
+    СтруктураКампании.Вставить("all_limit"       , 0);
+    СтруктураКампании.Вставить("start_time"      , ДатаСтарт);
+    СтруктураКампании.Вставить("stop_time"       , ДатаСтоп);
+    СтруктураКампании.Вставить("status"          , 1);
+    
+    МассивСтруктур.Добавить(СтруктураКампании);
+    
+    JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
+    
+    Параметры_.Вставить("data", JSONДата);
+    
+    Ответ    = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать рекламное объявление
+// Создает рекламное объявление на основе поста
+//
+// Параметры:
+//  НомерКампании  - Строка,Число - ID рекламной кампании                         - campaign
+//  ДневнойЛимит   - Строка,Число - Дневной лимит в рублях                        - limit
+//  НомерКатегории - Строка,Число - Номер рекламной категории                     - category
+//  IDПоста        - Строка,Число - ID поста, используемого в качетсве рекламы    - post
+//  IDКабинета     - Строка,Число - ID рекламного кабинета                        - cabinet
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьРекламноеОбъявление(Знач НомерКампании
+    , Знач ДневнойЛимит
+    , Знач НомерКатегории
+    , Знач IDПоста
+    , Знач IDКабинета
+    , Знач Параметры = "") Экспорт
+    
+    Параметры_  = ПолучитьСтандартныеПараметры(Параметры);   
+    GroupId     = Параметры_["group_id"];
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
+    
+    Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста;
+    
+    МассивСтруктур        = Новый Массив;    
+    СтруктураКампании     = Новый Структура;
+    СтруктураКампании.Вставить("campaign_id"                , НомерКампании);
+    СтруктураКампании.Вставить("ad_format"                  , 9);
+    СтруктураКампании.Вставить("conversion_event_id"        , 1);
+    СтруктураКампании.Вставить("autobidding"                , 1);
+    СтруктураКампании.Вставить("cost_type"                  , 3);
+    СтруктураКампании.Вставить("goal_type"                  , 2);
+    СтруктураКампании.Вставить("ad_platform"                , "all");
+    СтруктураКампании.Вставить("publisher_platforms"        , "vk");
+    СтруктураКампании.Вставить("publisher_platforms_auto"   , "1");
+    СтруктураКампании.Вставить("day_limit"                  , ДневнойЛимит);
+    СтруктураКампании.Вставить("all_limit"                  , "0");
+    СтруктураКампании.Вставить("category1_id"               , НомерКатегории);
+    СтруктураКампании.Вставить("age_restriction"            , 0);
+    СтруктураКампании.Вставить("status"                     , 1);
+    СтруктураКампании.Вставить("name"                       , "Объявление");
+    СтруктураКампании.Вставить("link_url"                   , Линк);
+    
+    МассивСтруктур.Добавить(СтруктураКампании);
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
+    
+    Параметры_.Вставить("data"        , МассивСтруктур);
+    Параметры_.Вставить("account_id"  , IDКабинета);
+    
+    Ответ    = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Приостановить рекламное объявление
+// Приостанавливает показ рекламного объявления
+//
+// Параметры:
+//  IDКабинета   - Строка,Число - ID рекламного кабинета - cabinet
+//  IDОбъявления - Строка,Число - ID объявления          - adv 
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+    Параметры_.Вставить("account_id", IDКабинета);
+    
+    МассивСтруктур    = Новый Массив;    
+    СтруктураКампании = Новый Структура;
+    
+    СтруктураКампании.Вставить("ad_id"  , IDОбъявления);
+    СтруктураКампании.Вставить("status" , 0);
+    
+    МассивСтруктур.Добавить(СтруктураКампании);
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
+    
+    Параметры_.Вставить("data", МассивСтруктур);
+        
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить список рекламных категорий
+// Получает список id рекламных категорий для создания рекламного объявления
+//
+// Параметры:
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Ответ      = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСТоварами
+
+// Получить список категорий товаров
+// Получает список ID товарных категорий для указания при создании товара
+//
+// Параметры:
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из Строка - Ключ - ID, Значение - Имя
+Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт
+    
+    Response   = "response";
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
+    Результат  = Ответ[Response];
+    
+    Если ЗначениеЗаполнено(Результат) Тогда
+    	
+    	Количество = Результат["count"];
+    	
+    	Если Не ЗначениеЗаполнено(Количество) Тогда
+    		Возврат Ответ;
+    	КонецЕсли;
+    	
+    Иначе
+    	Возврат Ответ;
+    КонецЕсли;
+    
+    Параметры_.Вставить("count", Количество);
+    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);   
+    Результат  = Ответ[Response]; 
+    
+    Если ЗначениеЗаполнено(Результат) Тогда
+    	
+    	Категории  = Результат["items"];
+    	
+    	Если Не ЗначениеЗаполнено(Категории) Тогда
+    		Возврат Ответ;
+    	КонецЕсли;
+    	
+    Иначе
+    	Возврат Ответ;
+    КонецЕсли;
+       
+    СоответствиеКатегорий = Новый Соответствие;
+    
+    Для Каждого Категория Из Категории Цикл      
+        СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]);
+    КонецЦикла;
+       
+    Возврат СоответствиеКатегорий;
+    
+КонецФункции
+
+// Получить список товаров
+// Получает список товаров сообщества
+//
+// Параметры:
+//  Подборка  - Строка,Число        - ID подборки, если нужен отбор - sel
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Массив соответствий товаров
+Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("count"        , 200);
+    Параметры_.Вставить("extended"     , 1);
+    Параметры_.Вставить("with_disabled", 1);
+    
+    Если ЗначениеЗаполнено(Подборка) Тогда
+        Параметры_.Вставить("album_id", Подборка);  
+    КонецЕсли;
+    
+    МассивТоваров = Новый Массив;
+    ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_);
+    
+    Возврат МассивТоваров;
+    
+КонецФункции
+
+// Получить товары по ID
+// Получает информацию о товарах по массиву ID
+//
+// Параметры:
+//  Товары    - Строка, Массив Из Строка - Массив ID товаров - items 
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары);
+    
+    Параметры_    = ПолучитьСтандартныеПараметры(Параметры);
+    СтрокаТоваров = "";
+    Owner         = "owner_id";
+    
+    Для Каждого Товар Из Товары Цикл       
+        ТекущийТовар  = Параметры_[Owner] + "_" + Товар;
+        ТекущийТовар  = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар);
+        СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ",";
+    КонецЦикла;
+    
+    СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1);
+    Параметры_.Вставить("item_ids", СтрокаТоваров);
+    Параметры_.Вставить("extended", 1);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_);
+    
+    Возврат Ответ;
+     
+КонецФункции
+
+// Добавить товар
+// Добавляет новый товар в каталог сообщества
+//
+// Параметры:
+//  ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
+//  Подборка       - Строка - ID подборка для помещения товара, если необходимо - sel
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт        
+    Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры);    
+КонецФункции
+
+// Изменить товар
+// Изменяет ранее созданный товар
+//
+// Параметры:
+//  Товар - Число,Строка - Идентификатор изменяемого товара - item
+//  ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
+//  Подборка - Строка - Идентификатор новой подборки, если необходимо - sel 
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт
+    Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры);    
+КонецФункции
+
+// Удалить товар
+// Удаляет ранее созданный товар
+//
+// Параметры:
+//  Товар - Строка,Число - ID товара - item
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("item_id", Товар);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Сгруппировать товары
+// Группирует товары на основе одинаковых наборов свойств
+//
+// Параметры:
+//  МассивТоваров      - Массив Из Строка - Массив ID товаров                       - items
+//  СуществующаяГруппа - Строка           - ID существующей группы, если необходимо - sellgroup
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
+    
+    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);
+    МассивТоваров_ = Новый Массив;
+    
+    Для Каждого Товар Из МассивТоваров Цикл
+        МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));
+    КонецЦикла;
+    
+    Товары = СтрСоединить(МассивТоваров_, ",");
+    
+    Параметры_.Вставить("item_ids", Товары);
+    
+    Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда
+        Параметры_.Вставить("item_group_id", СуществующаяГруппа);
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить описание товара. !NOCLI
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Пустое описание товара:
+//  *Имя - Строка - Имя товара
+//  *Описание - Строка - Описание товара
+//  *Категория - Строка - См. ПолучитьСписокКатегорийТоваров
+//  *Цена - Число - Цена товара
+//  *СтараяЦена - Число - Для отображения скидки/изменения цены
+//  *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото
+//  *URL - Строка - Ссылка на страницу сайта магазина
+//  *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото
+//  *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара
+//  *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе
+//  *Ширина - Число - Ширина товара в мм.
+//  *Высота - Число - Высота товара в мм.
+//  *Глубина - Число - Глубина товара в мм.
+//  *Вес - Число - Вес в гр.
+//  *SKU - Строка - SKU
+//  *ДоступныйОстаток - Число - Остаток. -1 - не ограничено
+Функция ПолучитьОписаниеТовара() Экспорт
+     
+    Товар = Новый Соответствие();
+    Товар.Вставить("Имя"                , "Новый товар");     // Имя товара
+    Товар.Вставить("Описание"           , "Описание товара"); // Описание товара
+    Товар.Вставить("Категория"          , "20173");           // См ПолучитьСписокКатегорийТоваров()
+    Товар.Вставить("Цена"               , 1);                 // Цена.
+    Товар.Вставить("СтараяЦена"         , Неопределено);      // Для отражения изменения цены 
+    Товар.Вставить("ОсновноеФото"       , Неопределено);      // ДД или путь к осн. фото
+    Товар.Вставить("URL"                , Неопределено);      // Ссылка на страницу магазина
+    Товар.Вставить("ДополнительныеФото" , Новый Массив);      // Массив путей или ДД для доп. фото
+    Товар.Вставить("ЗначенияСвойств"    , Новый Массив);      // Значения свойств (варианты). Максимум 2
+    Товар.Вставить("ГлавныйВГруппе"     , Ложь);              // Сделать главным в своей группе  
+    Товар.Вставить("Ширина"             , Неопределено);      // В миллиметрах
+    Товар.Вставить("Высота"             , Неопределено);      // В миллиметрах
+    Товар.Вставить("Глубина"            , Неопределено);      // В миллиметрах
+    Товар.Вставить("Вес"                , Неопределено);      // В граммах
+    Товар.Вставить("SKU"                , Неопределено);      // Артикул
+    Товар.Вставить("ДоступныйОстаток"   , 1);
+    
+    Возврат Товар;
+     
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСПодборкамиТоваров
+
+// Получить список подборок
+// Получает список подборок товаров
+//
+// Параметры:
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - Массив соответствий подборок
+Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("count", 100);
+    
+    МассивАльбомов = Новый Массив;
+    ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_);
+    
+    Возврат МассивАльбомов;
+    
+КонецФункции
+
+// Получить подборки по ID
+// Получить список подборок по массиву ID
+//
+// Параметры:
+//  Подборки  - Строка, Массив Из Строка - ID подборок - sels
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки);
+    
+    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);    
+    Подборки_      = Новый Массив;
+    СтрокаПодборок = "";
+      
+    Для Каждого Подборка Из Подборки Цикл
+        Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка));    
+    КонецЦикла;    
+    
+    СтрокаПодборок = СтрСоединить(Подборки_, ",");
+        
+    Параметры_.Вставить("album_ids", СтрокаПодборок);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_);
+    
+    Возврат Ответ;
+     
+КонецФункции
+
+// Создать подборку товаров
+// Создает пустую подборку товаров
+//
+// Параметры:
+//  Название  - Строка                - Название подборки - title
+//  Картинка  - Строка,ДвоичныеДанные - Файл картинки     - picture
+//  Основная  - Булево                - Основная          - main
+//  Скрытая   - Булево                - Скрытая           - hidden
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьПодборкуТоваров(Знач Название
+    , Знач Картинка
+    , Знач Основная = Ложь
+    , Знач Скрытая = Ложь
+    , Знач Параметры = "") Экспорт
+    
+    Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры);
+    
+КонецФункции
+
+// Изменить подборку товаров
+// Изменяет свойства подборки товаров
+//
+// Параметры:
+//  Название - Строка                - Новое название подборки         - title
+//  Подборка - Строка                - ID подборки					   - sel
+//  Картинка - Строка,ДвоичныеДанные - Новая картинка подборки         - picture
+//  Основная - Булево                - Основная                        - main
+//  Скрытая  - Булево                - Скрытая                         - hidden
+//  Параметры - Структура из Строка  - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ИзменитьПодборкуТоваров(Знач Название
+    , Знач Подборка
+    , Знач Картинка = ""
+    , Знач Основная = Ложь
+    , Знач Скрытая = Ложь
+    , Знач Параметры = "") Экспорт
+    
+    Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры);
+    
+КонецФункции
+
+// Добавить товар в подборку
+// Добавляет товар в подборку
+//
+// Параметры:
+//  МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items
+//  Подборка      - Строка                  - ID подборки              - sel
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+    
+    Параметры_     = ПолучитьСтандартныеПараметры(Параметры);
+    МассивТоваров_ = Новый Массив;
+      
+    Для Каждого Товар Из МассивТоваров Цикл
+        МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));    
+    КонецЦикла;    
+    
+    СписокТоваров = СтрСоединить(МассивТоваров_, ",");
+    
+    Параметры_.Вставить("item_ids" , СписокТоваров);
+    Параметры_.Вставить("album_ids", Подборка);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить товар из подборки
+// Удаляет ранее добавленный товар из подборки
+// 
+// Параметры:
+//  Товар     - Строка - ID товара   - item
+//  Подборка  - Строка - ID подборки - sel
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+
+    Параметры_   = ПолучитьСтандартныеПараметры(Параметры);
+    
+    Параметры_.Вставить("item_id"  , Товар);
+    Параметры_.Вставить("album_ids", Подборка);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить подборку
+// Удаляет подборку по ID
+//
+// Параметры:
+//  Подборка  - Строка              - ID подборки - sel
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("album_id", Подборка);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСоСвойствамиТоваров
+
+// Получить список свойств
+// Получает список свойств товаров группы
+// 
+// Параметры:
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
+Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт
+    
+    Response   = "response";
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    
+    Ответ      = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_);
+    Свойства   = Ответ[Response]["items"];
+    
+    Возврат Свойства;
+    
+КонецФункции
+
+// Создать свойство товара
+// Создает новое свойство для использования в товарах
+// 
+// Параметры:
+//  Название  - Строка              - Название свойства               - title
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
+Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("title", Название);
+        
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_);   
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Изменить свойство товара
+// Изменяет существующее свойство товара
+// 
+// Параметры:
+//  Название  - Строка              - Новое название                  - title
+//  Свойство  - Строка,Число        - ID свойства                     - prop
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
+Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("title"      , Название);
+    Параметры_.Вставить("property_id", Свойство);
+    Параметры_.Вставить("type"       , "text");
+        
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_);   
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Удалить свойство товара
+// Удаляет существующее свойство товара
+// 
+// Параметры:
+//  Свойство  - Строка,Число        - ID свойства                     - prop
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
+Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("property_id", Свойство);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Добавить вариант свойства товара
+// Добавляет вариант для существующего свойства
+// 
+// Параметры:
+//  Значение  - Строка              - Значение свойства                      - value
+//  Свойство  - Строка,Число        - ID свойства, куда добавляется вариант  - prop
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK    
+Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("property_id", Свойство);
+    Параметры_.Вставить("title"      , Значение);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Изменить вариант свойства товара
+// Изменяет значение варианта существующего свойства товара
+// 
+// Параметры:
+//  Значение  - Строка              - Новое значение свойства         - value
+//  Свойство  - Строка,Число        - ID свойства                     - prop
+//  Вариант   - Строка,Число        - ID варианта                     - option
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK      
+Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("property_id", Свойство);
+    Параметры_.Вставить("variant_id" , Вариант);
+    Параметры_.Вставить("title"      , Значение);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Удалить вариант свойства товара
+// Удаляет ранее созданный вариант свойства
+// 
+// Параметры:
+//  Вариант   - Строка,Число        - ID варианта - option
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK     
+Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("variant_id", Вариант);
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСЗаказами
+
+// Получить список заказов
+// Возвращает список заказов сообщества
+// 
+// Параметры:
+//  Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK 
+Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт
+    
+    Параметры = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры.Вставить("count", 50);
+    
+    МассивЗаказов = Новый Массив;
+    ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры);
+    
+    Возврат МассивЗаказов;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область Прочие
+
+// Сформировать клавиатуру
+// Формирует клавиатуру по массиву кнопок
+// 
+// Параметры:
+//  МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons
+// 
+// Возвращаемое значение:
+//  Строка -  JSON клавиатуры
+Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт
+      
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);  
+    
+    Клавиатура          = Новый Структура;
+    МассивКлавиатуры    = Новый Массив;
+    МассивБлока         = Новый Массив;
+    
+    Для Каждого Действие Из МассивКнопок Цикл
+        
+        Кнопка      = Новый Структура;
+        Выражение   = Новый Структура;                        
+        
+        Выражение.Вставить("type" , "text");
+        Выражение.Вставить("label", Действие);
+        
+        Кнопка.Вставить("action", Выражение);
+        МассивБлока.Добавить(Кнопка);
+        
+    КонецЦикла;
+    
+    МассивКлавиатуры.Добавить(МассивБлока);
+    
+    Клавиатура.Вставить("buttons" , МассивКлавиатуры);   
+    Клавиатура.Вставить("one_time", Ложь);
+    
+    Возврат OPI_Инструменты.JSONСтрокой(Клавиатура);
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
+    
+    // Здесь собрано определение данных для работы с VK API
+    // Вы можете переопределять их, передавая в качестве параметра
+    // Совпадающие поля будут перезаписаны с приоритетом параметра функции
+    
+    Параметры_ = Новый Структура;
+    
+    // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
+    // from_group   - действия будут выполняться от лица группы
+    // owner_id     - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
+    //               установлен свой
+    // app_id       - id приложения, которое необходимо создать в профиле на странице для разработчиков
+    // group_id     - owner_id, но без "-"
+    
+    Параметры_.Вставить("access_token"  , "");
+    Параметры_.Вставить("from_group"    , "1");
+    Параметры_.Вставить("owner_id"      , "");
+    Параметры_.Вставить("v"             , "5.131");
+    Параметры_.Вставить("app_id"        , "");
+    Параметры_.Вставить("group_id"      , "");
+    
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
+    
+    Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
+        Для Каждого ПереданныйПараметр Из Параметры Цикл
+            Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
+        КонецЦикла;
+    КонецЕсли;
+
+    Возврат Параметры_;
+
+КонецФункции
+
+Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид)
+	
+	Response  = "response";
+    Ответ     = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);
+    Результат = Ответ[Response];
+
+    Если ЗначениеЗаполнено(Результат) Тогда
+    	ИДФото = Результат["photo_id"];
+    	
+    	Если Не ЗначениеЗаполнено(ИДФото) Тогда
+    		Возврат Ответ;	
+    	КонецЕсли;
+    	
+    Иначе
+    	Возврат Ответ;
+    КонецЕсли;
+    
+    ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
+    Возврат ИДФото;
+    
+КонецФункции
+
+Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид)
+	
+	Ответ       = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);   
+    ОтветМассив = Ответ.Получить("response");
+    
+    Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда
+    	Возврат Ответ;
+    Иначе
+    	Если ОтветМассив.Количество() = 0 Тогда
+    		Возврат Ответ;
+    	Иначе
+    		ОтветСоответствие = ОтветМассив[0];
+    	КонецЕсли;
+    КонецЕсли;
+     
+    Возврат ОтветСоответствие;
+       
+КонецФункции
+
+Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "")
+	
+	Response   = "response";
+	Подборки   = ПолучитьПодборкиПоИД(Подборки, Параметры);
+    Результат  = Подборки[Response];
+    
+    Если ЗначениеЗаполнено(Результат) Тогда
+    	
+    	МассивПодборок = Результат["items"];
+    	
+    	Если Не ЗначениеЗаполнено(МассивПодборок) Тогда
+    		Возврат Подборки;	
+    	КонецЕсли;
+    	
+	Иначе
+		Возврат Подборки;
+    КонецЕсли;
+    
+    Возврат МассивПодборок;
+            
+КонецФункции
+
+Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид)
+    
+    СоответствиеМетодов = Новый Соответствие;
+    Загрузка            = "Загрузка";
+    Сохранение          = "Сохранение";
+    Способ              = "Способ";
+    Фото                = "Фото";
+    
+    Если Вид = "Пост" Тогда
+       
+        СоответствиеМетодов.Вставить(Загрузка  , "photos.getWallUploadServer");
+        СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto");
+        СоответствиеМетодов.Вставить(Фото      , "photo");
+        СоответствиеМетодов.Вставить(Способ    , 1);
+        
+    ИначеЕсли Вид = "Товар" Тогда
+        
+        СоответствиеМетодов.Вставить(Загрузка  , "market.getProductPhotoUploadServer");
+        СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto");
+        СоответствиеМетодов.Вставить(Способ    , 2);
+        
+    ИначеЕсли Вид = "История" Тогда
+        
+        СоответствиеМетодов.Вставить(Загрузка  , "stories.getPhotoUploadServer");
+        СоответствиеМетодов.Вставить(Сохранение, "stories.save");
+        СоответствиеМетодов.Вставить(Способ    , 3);
+    
+    ИначеЕсли Вид = "Опрос" Тогда
+        
+        СоответствиеМетодов.Вставить(Загрузка  , "polls.getPhotoUploadServer");
+        СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto");
+        СоответствиеМетодов.Вставить(Фото      , "photo");
+        СоответствиеМетодов.Вставить(Способ    , 1);
+        
+    Иначе
+        
+        СоответствиеМетодов.Вставить(Загрузка  , "photos.getUploadServer");
+        СоответствиеМетодов.Вставить(Сохранение, "photos.save");
+        СоответствиеМетодов.Вставить(Фото      , "photos_list");
+        СоответствиеМетодов.Вставить(Способ    , 1);
+        
+    КонецЕсли;
+    
+    Возврат СоответствиеМетодов;
+    
+КонецФункции
+
+Функция ПолучитьСоответствиеПараметровТовара()
+    
+    Поля = Новый Соответствие();
+    Поля.Вставить("Имя"                , "name");     
+    Поля.Вставить("Описание"           , "description"); 
+    Поля.Вставить("Категория"          , "category_id");                 
+    Поля.Вставить("Цена"               , "price");                 
+    Поля.Вставить("СтараяЦена"         , "old_price");  
+    Поля.Вставить("URL"                , "url");
+    Поля.Вставить("ГлавныйВГруппе"     , "is_main_variant"); 
+    Поля.Вставить("Ширина"             , "dimension_width");      
+    Поля.Вставить("Высота"             , "dimension_height");      
+    Поля.Вставить("Глубина"            , "dimension_length");      
+    Поля.Вставить("Вес"                , "weight");      
+    Поля.Вставить("SKU"                , "sku"); 
+    Поля.Вставить("ДоступныйОстаток"   , "stock_amount");
+       
+    Возврат Поля;
+
+КонецФункции
+
+Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "")
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+    Параметры_.Вставить("v", "5.199");
+    
+    Response = "response";
+    
+    ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_);
+    
+    Если ЗначениеЗаполнено(ИДТовара) Тогда       
+        Параметры_.Вставить("item_id", ИДТовара);
+        Метод = "edit";    
+    Иначе       
+        Метод = "add";
+    КонецЕсли;
+       
+    Ответ     = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
+    Результат = Ответ[Response];
+    
+    Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда 
+    	
+        ИДТовара = Результат["market_item_id"];
+        
+        Если Не ЗначениеЗаполнено(ИДТовара) Тогда
+        	Возврат Ответ;	
+        КонецЕсли;
+        
+    Иначе
+    	Возврат Ответ;
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда
+        ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_);
+    КонецЕсли;
+    
+    Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеПодборкой(Знач Название
+    , Знач Картинка   = ""
+    , Знач ИДПодборки = ""
+    , Знач Основная   = Ложь
+    , Знач Скрытая    = Ложь
+    , Знач Параметры  = "")
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Основная);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая);
+    
+    Параметры_ = ПолучитьСтандартныеПараметры(Параметры);   
+    Ответ      = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_);
+    
+    Если ЗначениеЗаполнено(Ответ) Тогда
+        Возврат Ответ;
+    КонецЕсли;
+      
+    Параметры_.Вставить("title"        , Название);
+    Параметры_.Вставить("main_album"   , ?(Основная, 1, 0));
+    Параметры_.Вставить("is_hidden"    , ?(Скрытая, 1, 0));
+    
+    Если ЗначениеЗаполнено(ИДПодборки) Тогда       
+        Параметры_.Вставить("album_id", ИДПодборки);
+        Метод = "editAlbum";    
+    Иначе       
+        Метод = "addAlbum";
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры)
+    
+    PhotoID = "photo_id";
+    
+    Если ЗначениеЗаполнено(Картинка) Тогда
+        
+        ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар");
+        
+        Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
+            Возврат ИДФото; 
+        КонецЕсли;
+      
+        Параметры.Вставить(PhotoID, ИДФото);
+        
+    Иначе
+        
+        Если ЗначениеЗаполнено(ИДПодборки) Тогда
+            
+            Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры);
+            
+            Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда
+                Возврат Подборки;   
+            КонецЕсли;
+                                
+            Если Не Подборки.Количество() = 0 Тогда              
+                ИДФото = Подборки[0]["photo"]["id"];
+                OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото);
+                Параметры.Вставить(PhotoID, ИДФото);
+            КонецЕсли;
+            
+        КонецЕсли;
+        
+    КонецЕсли;
+    
+    Возврат "";
+    
+КонецФункции
+
+Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры)
+    
+    Response            = "response";
+    Способ              = Метод["Способ"];
+    СтандартныйСпособ   = 1;
+    НовыйСпособ         = 2;
+
+    Если Способ = СтандартныйСпособ Тогда
+        
+        Hash       = "hash";
+        Serv       = "server";
+        Aid        = "aid";
+        Фото       = Метод["Фото"];
+        
+        Параметры.Вставить(Hash, Ответ[Hash]);
+        Параметры.Вставить(Фото, Ответ[Фото]);
+        
+        СерверФото = Ответ.Получить(Serv);
+               
+        Если ЗначениеЗаполнено(СерверФото) Тогда
+            СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото);
+            Параметры.Вставить(Serv, СерверФото);      
+        КонецЕсли;
+        
+        Идентификатор = Ответ.Получить(Aid);
+               
+        Если ЗначениеЗаполнено(Идентификатор) Тогда
+            Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор);
+            Параметры.Вставить(Aid , Идентификатор);      
+        КонецЕсли;
+        
+    ИначеЕсли Способ = НовыйСпособ Тогда
+        
+        ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ);
+        Параметры.Вставить("upload_response", ОтветСтрокой);
+        
+    Иначе
+        
+        Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]);
+        
+    КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры)
+    
+    Response     = "response";
+    ОсновноеФото = ОписаниеТовара["ОсновноеФото"];
+    ДопФото      = ОписаниеТовара["ДополнительныеФото"];
+    Свойства     = ОписаниеТовара["ЗначенияСвойств"];
+    
+    Если ЗначениеЗаполнено(ОсновноеФото) Тогда
+    	
+        Ответ     = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар");
+        Результат = Ответ[Response];
+        
+        Если ЗначениеЗаполнено(Результат) Тогда
+        	ИДФото = Результат["photo_id"];
+        	
+        	Если Не ЗначениеЗаполнено(ИДФото) Тогда
+        		Возврат;	
+        	КонецЕсли;
+        	
+        Иначе
+        	Возврат;
+        КонецЕсли;
+        
+        ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
+        Параметры.Вставить("main_photo_id", ИДФото); 
+         
+    КонецЕсли;
+    
+    Если ТипЗнч(Свойства) = Тип("Массив") Тогда  
+        
+        Свойства_ = Новый Массив;
+        
+        Для Каждого Свойство Из Свойства Цикл
+            Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство));   
+        КонецЦикла;
+        
+        Свойства = СтрСоединить(Свойства_, ","); 
+        
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Свойства) Тогда
+        Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства));    
+    КонецЕсли;
+    
+    ДобавитьДополнительныеФотоТовара(ДопФото, Параметры);
+    
+    Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл
+        
+        Значение = ОписаниеТовара[Поле.Ключ];
+        
+        Если Значение <> Неопределено Тогда
+            Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]);
+        КонецЕсли;
+        
+    КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьДополнительныеФотоТовара(Знач МассивФото, Параметры)
+    
+    Если ТипЗнч(МассивФото) = Тип("Массив") Тогда
+        Если МассивФото.Количество() > 0 Тогда
+            
+            СтрокаФотографий = "";
+            
+            Для Каждого Фото Из МассивФото Цикл
+                
+                ИДФото = ПолучитьИДКартинки(Фото, Параметры, "Товар");
+                
+		        Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
+		    		Возврат;	
+		    	КонецЕсли;
+
+                СтрокаФотографий = СтрокаФотографий + ИДФото + ","; 
+                
+            КонецЦикла;
+            
+            СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1);
+            Параметры.Вставить("photo_ids", СтрокаФотографий);
+        КонецЕсли;
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0)
+    
+    Response         = "response";
+    МаксимумВЗапросе = 200;
+    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры);
+    Товары           = Ответ[Response]["items"];
+    
+    Если Товары.Количество() = 0 Тогда
+        Возврат;
+    КонецЕсли;      
+    
+    Для Каждого Товар Из Товары Цикл
+        МассивТоваров.Добавить(Товар);
+    КонецЦикла;
+       
+    Сдвиг = Сдвиг + МаксимумВЗапросе;
+    Параметры.Вставить("offset", Сдвиг);
+    ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг);
+    
+КонецПроцедуры
+
+Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0)
+    
+    Response         = "response";
+    МаксимумВЗапросе = 100;
+    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры);
+    Альбомы          = Ответ[Response]["items"];
+    
+    Если Альбомы.Количество() = 0 Тогда
+        Возврат;
+    КонецЕсли;      
+    
+    Для Каждого Альбом Из Альбомы Цикл
+        МассивАльбомов.Добавить(Альбом);
+    КонецЦикла;
+       
+    Сдвиг = Сдвиг + МаксимумВЗапросе;
+    Параметры.Вставить("offset", Сдвиг);
+    ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг);
+    
+КонецПроцедуры
+
+Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0)
+    
+    Response         = "response";
+    МаксимумВЗапросе = 50;
+    Ответ            = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры);
+    Заказы           = Ответ[Response]["items"];
+    
+    Если Заказы.Количество() = 0 Тогда
+        Возврат;
+    КонецЕсли;      
+    
+    Для Каждого Заказ Из Заказы Цикл
+        МассивЗаказов.Добавить(Заказ);
+    КонецЦикла;
+       
+    Сдвиг = Сдвиг + МаксимумВЗапросе;
+    Параметры.Вставить("offset", Сдвиг);
+    ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг);
+    
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Viber.os b/src/ru/OInt/core/Modules/OPI_Viber.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_Viber.os
rename to src/ru/OInt/core/Modules/OPI_Viber.os
index 1d2dd91c96..7443cbf692 100644
--- a/ru/OInt/core/Modules/OPI_Viber.os
+++ b/src/ru/OInt/core/Modules/OPI_Viber.os
@@ -1,414 +1,414 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Viber.os
-// Библиотека: Viber
-// Команда CLI: viber
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
- 
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область НастройкиИИнформация
-
-// Установить Webhook
-// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
-// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
-// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
-// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
-// 
-// Параметры:
-//  Токен - Строка - Токен Viber               - token
-//  URL   - Строка - URL для установки Webhook - url
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("url"         , URL  , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("auth_token"  , Токен, "Строка", Параметры);
- 
-    Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры);
-    
-КонецФункции
-
-// Получить информацию о канале
-// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
-// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
-// 
-// Параметры:
-//  Токен - Строка - Токен - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
-    
-    URL = "https://chatapi.viber.com/pa/get_account_info";   
-    Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен));
-    
-КонецФункции
-
-// Получить данные пользователя
-// Получает информацию о пользователе по ID
-// 
-// Параметры:
-//  Токен          - Строка        - Токен                 - token
-//  IDПользователя - Строка, Число - ID пользователя Viber - user
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
-    
-    URL = "https://chatapi.viber.com/pa/get_user_details";
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры);
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
-
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить онлайн пользователей
-// Получает статус пользователя или нескольких пользователей по ID
-// 
-// Параметры:
-//  Токен           - Строка                              - Токен Viber                - token
-//  IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber  - users
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
-    
-    URL = "https://chatapi.viber.com/pa/get_online";
-        
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры);
-    
-    Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
-    
-    Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область ОтправкаСообщений
-
-// Отправить текстовое сообщение
-// Отправляет текстовое сообщение в чат или канал
-// 
-// Параметры:
-//  Токен          - Строка       - Токен                                                               - token
-//  Текст          - Строка       - Текст сообщения                                                     - text
-//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
-//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                     - ischannel
-//  Клавиатура     - Структура из Строка -  См. СформироватьКлавиатуруИзМассиваКнопок - keyboard
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьТекстовоеСообщение(Знач Токен
-    , Знач Текст
-    , Знач IDПользователя
-    , Знач ОтправкаВКанал
-    , Знач Клавиатура = "") Экспорт
-    
-    Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура); 
-    
-КонецФункции
-
-// Отправить картинку
-// Отправляет картинку в чат или канал
-// 
-// Параметры:
-//  Токен          - Строка       - Токен                                                                - token
-//  URL            - Строка       - URL картинки                                                         - picture
-//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user
-//  ОтправкаВКанал - булево       - Отправка в канал или в чат бота                                      - ischannel
-//  Описание       - Строка       - Аннотация к картинке                                                 - description
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
-    
-    Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
-    
-КонецФункции
-
-// Отправить файл
-// Отправляет файл (документ) в чат или канал
-// 
-// Параметры:
-//  Токен          - Строка       - Токен                                                                - token
-//  URL            - Строка       - URL файла                                                            - file 
-//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user   
-//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                      - ischannel
-//  Расширение     - Строка       - Расширение файла                                                     - ext
-//  Размер         - Число        - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьФайл(Знач Токен
-    , Знач URL
-    , Знач IDПользователя
-    , Знач ОтправкаВКанал
-    , Знач Расширение
-    , Знач Размер = "") Экспорт
-        
-    Если Не ЗначениеЗаполнено(Размер) Тогда
-        
-        Ответ  = OPI_Инструменты.Get(URL);
-        Размер = Ответ.Размер();
-        
-    КонецЕсли;
-    
-    Строка_    = "Строка";
-    Расширение = СтрЗаменить(Расширение, ".", "");
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("URL"       , URL       , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("Размер"    , Размер    , Строка_, Параметры);
-    OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры);
-    
-    Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры);
-    
-КонецФункции
-
-// Отправить контакт
-// Отправляет контакт с номером телефона в чат или канал
-// 
-// Параметры:
-//  Токен          - Строка       - Токен                                                                - token
-//  ИмяКонтакта    - Строка       - Имя контакта                                                         - name
-//  НомерТелефона  - Строка       - Номер телефона                                                       - phone
-//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user  
-//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                      - ischannel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьКонтакт(Знач Токен
-    , Знач ИмяКонтакта
-    , Знач НомерТелефона
-    , Знач IDПользователя
-    , Знач ОтправкаВКанал) Экспорт
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("name"        , ИмяКонтакта  , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры);
-    
-    Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры); 
-    
-КонецФункции
-
-// Отправить локацию
-// Отправляет географические координаты в чат или канал
-// 
-// Параметры:
-//  Токен          - Строка       - Токен                                                                - token
-//  Широта         - Строка,Число - Географическая широта                                                - lat
-//  Долгота        - Строка,Число - Географическая долгота                                               - long
-//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user  
-//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                      - ischannel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
-    
-    Параметры = Новый Структура;
-    OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры);
-    OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры);
-    
-    Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры);
-    
-КонецФункции
-
-// Отправить ссылку
-// Отправляет URL с предпросмотром в чат или канал
-// 
-// Параметры:
-//  Токен          - Строка       - Токен                                                                - token
-//  URL            - Строка       - Отправляемая ссылка                                                  - url
-//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user  
-//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                      - ischannel
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
-    
-    Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
-    
-КонецФункции
-
-// Сформировать клавиатуру из массива кнопок
-// Возвращает структура клавиатуры для сообщений
-// 
-// Параметры:
-//  МассивКнопок - Массив из Строка - Массив кнопок                - buttons
-//  ЦветКнопок   - Строка           - HEX цвет кнопок с # в начале - color
-// 
-// Возвращаемое значение:
-//  Структура -  Сформировать клавиатуру из массива кнопок:
-// * Buttons - Массив из Структура - Массив сформированных кнопок 
-// * Type - Строка - Тип клавиатуры 
-Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
-    
-    МассивСтруктурКнопок = Новый Массив;
-    СтруктураКлавиатуры  = Новый Структура;
-    
-    Для Каждого ТекстКнопки Из МассивКнопок Цикл
-        
-        СтруктураКнопки = Новый Структура;
-        СтруктураКнопки.Вставить("ActionType", "reply");
-        СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
-        СтруктураКнопки.Вставить("Text"      , ТекстКнопки);
-        СтруктураКнопки.Вставить("BgColor"   , ЦветКнопок);
-        СтруктураКнопки.Вставить("Coloumns"  , 3);
-    
-        МассивСтруктурКнопок.Добавить(СтруктураКнопки);
-        
-    КонецЦикла;
-    
-    СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
-    СтруктураКлавиатуры.Вставить("Type"   , "keyboard");
-    
-    Возврат СтруктураКлавиатуры;
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-// Отправить сообщение.
-// 
-// Параметры:
-//  Токен - Строка - Токен
-//  Тип - Строка -  Тип отправляемого сообщения
-//  IDПользователя - Строка,Число - ID пользователя Viber
-//  ЭтоКанал - Булево - Отправка в канал или чат с ботом
-//  Значение - Строка, Структура -  Значение:
-// * URL - Строка - При отправке  URL
-// * Размер - Число, Строка - Размер файла в случае отправке
-// * Расширение - Строка - Расширение файла в случае отправки
-//  Текст - Строка -  Текст сообщения
-//  Клавиатура - Структура из Строка -  Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок 
-// 
-// Возвращаемое значение:
-//  Произвольный, HTTPОтвет -  Отправить сообщение
-Функция ОтправитьСообщение(Знач Токен
-    , Знач Тип
-    , Знач IDПользователя
-    , Знач ЭтоКанал
-    , Знач Значение = ""
-    , Знач Текст = ""
-    , Знач Клавиатура = "")
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал);
-    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура);
-    
-    СтруктураПараметров = ВернутьСтандартныеПараметры();
-    СтруктураПараметров.Вставить("type", Тип);  
-    
-    Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда
-        СтруктураПараметров.Вставить("text", Текст);
-    КонецЕсли;
-    
-    Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда
-        СтруктураПараметров.Вставить("keyboard", Клавиатура);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Значение) Тогда
-        
-        Если Тип = "file" Тогда
-            СтруктураПараметров.Вставить("media"    , Значение["URL"]);
-            СтруктураПараметров.Вставить("size"     , Значение["Размер"]);
-            СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]);
-        ИначеЕсли Тип = "contact" Тогда
-            СтруктураПараметров.Вставить("contact"  , Значение);
-        ИначеЕсли Тип = "location" Тогда
-            СтруктураПараметров.Вставить("location" , Значение);
-        Иначе
-            СтруктураПараметров.Вставить("media"    , Значение);
-        КонецЕсли;
-        
-    КонецЕсли;
-    
-    Если ЭтоКанал Тогда
-        СтруктураПараметров.Вставить("from", IDПользователя);
-        URL = "https://chatapi.viber.com/pa/post";
-    Иначе   
-        СтруктураПараметров.Вставить("receiver", IDПользователя);
-        URL = "https://chatapi.viber.com/pa/send_message";
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Post(URL, СтруктураПараметров, ТокенВЗаголовки(Токен));
-    
-    Попытка
-        Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
-    Исключение
-        Возврат Ответ;
-    КонецПопытки;
-    
-КонецФункции
-
-Функция ВернутьСтандартныеПараметры() 
-    
-    СтруктураОтправителя = Новый Структура;
-    СтруктураОтправителя.Вставить("name"  , "Bot");
-    СтруктураОтправителя.Вставить("avatar", "");
-    
-    СтруктураПараметров  = Новый Структура;
-    СтруктураПараметров.Вставить("sender", СтруктураОтправителя);
-    СтруктураПараметров.Вставить("min_api_version", 1);
-    
-    Возврат СтруктураПараметров;
-    
-КонецФункции
-
-Функция ТокенВЗаголовки(Знач Токен)
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    СтруктураЗаголовков = Новый Соответствие;
-    СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
-    Возврат СтруктураЗаголовков;
-    
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Viber.os
+// Библиотека: Viber
+// Команда CLI: viber
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+ 
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область НастройкиИИнформация
+
+// Установить Webhook
+// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
+// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
+// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
+// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
+// 
+// Параметры:
+//  Токен - Строка - Токен Viber               - token
+//  URL   - Строка - URL для установки Webhook - url
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("url"         , URL  , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("auth_token"  , Токен, "Строка", Параметры);
+ 
+    Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры);
+    
+КонецФункции
+
+// Получить информацию о канале
+// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
+// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
+// 
+// Параметры:
+//  Токен - Строка - Токен - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
+    
+    URL = "https://chatapi.viber.com/pa/get_account_info";   
+    Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен));
+    
+КонецФункции
+
+// Получить данные пользователя
+// Получает информацию о пользователе по ID
+// 
+// Параметры:
+//  Токен          - Строка        - Токен                 - token
+//  IDПользователя - Строка, Число - ID пользователя Viber - user
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
+    
+    URL = "https://chatapi.viber.com/pa/get_user_details";
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры);
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
+
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить онлайн пользователей
+// Получает статус пользователя или нескольких пользователей по ID
+// 
+// Параметры:
+//  Токен           - Строка                              - Токен Viber                - token
+//  IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber  - users
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
+    
+    URL = "https://chatapi.viber.com/pa/get_online";
+        
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры);
+    
+    Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
+    
+    Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОтправкаСообщений
+
+// Отправить текстовое сообщение
+// Отправляет текстовое сообщение в чат или канал
+// 
+// Параметры:
+//  Токен          - Строка       - Токен                                                               - token
+//  Текст          - Строка       - Текст сообщения                                                     - text
+//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
+//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                     - ischannel
+//  Клавиатура     - Структура из Строка -  См. СформироватьКлавиатуруИзМассиваКнопок - keyboard
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьТекстовоеСообщение(Знач Токен
+    , Знач Текст
+    , Знач IDПользователя
+    , Знач ОтправкаВКанал
+    , Знач Клавиатура = "") Экспорт
+    
+    Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура); 
+    
+КонецФункции
+
+// Отправить картинку
+// Отправляет картинку в чат или канал
+// 
+// Параметры:
+//  Токен          - Строка       - Токен                                                                - token
+//  URL            - Строка       - URL картинки                                                         - picture
+//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user
+//  ОтправкаВКанал - булево       - Отправка в канал или в чат бота                                      - ischannel
+//  Описание       - Строка       - Аннотация к картинке                                                 - description
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
+    
+    Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
+    
+КонецФункции
+
+// Отправить файл
+// Отправляет файл (документ) в чат или канал
+// 
+// Параметры:
+//  Токен          - Строка       - Токен                                                                - token
+//  URL            - Строка       - URL файла                                                            - file 
+//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user   
+//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                      - ischannel
+//  Расширение     - Строка       - Расширение файла                                                     - ext
+//  Размер         - Число        - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьФайл(Знач Токен
+    , Знач URL
+    , Знач IDПользователя
+    , Знач ОтправкаВКанал
+    , Знач Расширение
+    , Знач Размер = "") Экспорт
+        
+    Если Не ЗначениеЗаполнено(Размер) Тогда
+        
+        Ответ  = OPI_Инструменты.Get(URL);
+        Размер = Ответ.Размер();
+        
+    КонецЕсли;
+    
+    Строка_    = "Строка";
+    Расширение = СтрЗаменить(Расширение, ".", "");
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("URL"       , URL       , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("Размер"    , Размер    , Строка_, Параметры);
+    OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры);
+    
+    Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры);
+    
+КонецФункции
+
+// Отправить контакт
+// Отправляет контакт с номером телефона в чат или канал
+// 
+// Параметры:
+//  Токен          - Строка       - Токен                                                                - token
+//  ИмяКонтакта    - Строка       - Имя контакта                                                         - name
+//  НомерТелефона  - Строка       - Номер телефона                                                       - phone
+//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user  
+//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                      - ischannel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьКонтакт(Знач Токен
+    , Знач ИмяКонтакта
+    , Знач НомерТелефона
+    , Знач IDПользователя
+    , Знач ОтправкаВКанал) Экспорт
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("name"        , ИмяКонтакта  , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры);
+    
+    Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры); 
+    
+КонецФункции
+
+// Отправить локацию
+// Отправляет географические координаты в чат или канал
+// 
+// Параметры:
+//  Токен          - Строка       - Токен                                                                - token
+//  Широта         - Строка,Число - Географическая широта                                                - lat
+//  Долгота        - Строка,Число - Географическая долгота                                               - long
+//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user  
+//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                      - ischannel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
+    
+    Параметры = Новый Структура;
+    OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры);
+    OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры);
+    
+    Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры);
+    
+КонецФункции
+
+// Отправить ссылку
+// Отправляет URL с предпросмотром в чат или канал
+// 
+// Параметры:
+//  Токен          - Строка       - Токен                                                                - token
+//  URL            - Строка       - Отправляемая ссылка                                                  - url
+//  IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя  - user  
+//  ОтправкаВКанал - Булево       - Отправка в канал или в чат бота                                      - ischannel
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
+    
+    Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
+    
+КонецФункции
+
+// Сформировать клавиатуру из массива кнопок
+// Возвращает структура клавиатуры для сообщений
+// 
+// Параметры:
+//  МассивКнопок - Массив из Строка - Массив кнопок                - buttons
+//  ЦветКнопок   - Строка           - HEX цвет кнопок с # в начале - color
+// 
+// Возвращаемое значение:
+//  Структура -  Сформировать клавиатуру из массива кнопок:
+// * Buttons - Массив из Структура - Массив сформированных кнопок 
+// * Type - Строка - Тип клавиатуры 
+Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
+    
+    МассивСтруктурКнопок = Новый Массив;
+    СтруктураКлавиатуры  = Новый Структура;
+    
+    Для Каждого ТекстКнопки Из МассивКнопок Цикл
+        
+        СтруктураКнопки = Новый Структура;
+        СтруктураКнопки.Вставить("ActionType", "reply");
+        СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
+        СтруктураКнопки.Вставить("Text"      , ТекстКнопки);
+        СтруктураКнопки.Вставить("BgColor"   , ЦветКнопок);
+        СтруктураКнопки.Вставить("Coloumns"  , 3);
+    
+        МассивСтруктурКнопок.Добавить(СтруктураКнопки);
+        
+    КонецЦикла;
+    
+    СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
+    СтруктураКлавиатуры.Вставить("Type"   , "keyboard");
+    
+    Возврат СтруктураКлавиатуры;
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+// Отправить сообщение.
+// 
+// Параметры:
+//  Токен - Строка - Токен
+//  Тип - Строка -  Тип отправляемого сообщения
+//  IDПользователя - Строка,Число - ID пользователя Viber
+//  ЭтоКанал - Булево - Отправка в канал или чат с ботом
+//  Значение - Строка, Структура -  Значение:
+// * URL - Строка - При отправке  URL
+// * Размер - Число, Строка - Размер файла в случае отправке
+// * Расширение - Строка - Расширение файла в случае отправки
+//  Текст - Строка -  Текст сообщения
+//  Клавиатура - Структура из Строка -  Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок 
+// 
+// Возвращаемое значение:
+//  Произвольный, HTTPОтвет -  Отправить сообщение
+Функция ОтправитьСообщение(Знач Токен
+    , Знач Тип
+    , Знач IDПользователя
+    , Знач ЭтоКанал
+    , Знач Значение = ""
+    , Знач Текст = ""
+    , Знач Клавиатура = "")
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал);
+    OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура);
+    
+    СтруктураПараметров = ВернутьСтандартныеПараметры();
+    СтруктураПараметров.Вставить("type", Тип);  
+    
+    Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда
+        СтруктураПараметров.Вставить("text", Текст);
+    КонецЕсли;
+    
+    Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда
+        СтруктураПараметров.Вставить("keyboard", Клавиатура);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Значение) Тогда
+        
+        Если Тип = "file" Тогда
+            СтруктураПараметров.Вставить("media"    , Значение["URL"]);
+            СтруктураПараметров.Вставить("size"     , Значение["Размер"]);
+            СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]);
+        ИначеЕсли Тип = "contact" Тогда
+            СтруктураПараметров.Вставить("contact"  , Значение);
+        ИначеЕсли Тип = "location" Тогда
+            СтруктураПараметров.Вставить("location" , Значение);
+        Иначе
+            СтруктураПараметров.Вставить("media"    , Значение);
+        КонецЕсли;
+        
+    КонецЕсли;
+    
+    Если ЭтоКанал Тогда
+        СтруктураПараметров.Вставить("from", IDПользователя);
+        URL = "https://chatapi.viber.com/pa/post";
+    Иначе   
+        СтруктураПараметров.Вставить("receiver", IDПользователя);
+        URL = "https://chatapi.viber.com/pa/send_message";
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Post(URL, СтруктураПараметров, ТокенВЗаголовки(Токен));
+    
+    Попытка
+        Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
+    Исключение
+        Возврат Ответ;
+    КонецПопытки;
+    
+КонецФункции
+
+Функция ВернутьСтандартныеПараметры() 
+    
+    СтруктураОтправителя = Новый Структура;
+    СтруктураОтправителя.Вставить("name"  , "Bot");
+    СтруктураОтправителя.Вставить("avatar", "");
+    
+    СтруктураПараметров  = Новый Структура;
+    СтруктураПараметров.Вставить("sender", СтруктураОтправителя);
+    СтруктураПараметров.Вставить("min_api_version", 1);
+    
+    Возврат СтруктураПараметров;
+    
+КонецФункции
+
+Функция ТокенВЗаголовки(Знач Токен)
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    СтруктураЗаголовков = Новый Соответствие;
+    СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
+    Возврат СтруктураЗаголовков;
+    
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_YandexDisk.os b/src/ru/OInt/core/Modules/OPI_YandexDisk.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_YandexDisk.os
rename to src/ru/OInt/core/Modules/OPI_YandexDisk.os
index 2b3d69eed2..bdef59a75d 100644
--- a/ru/OInt/core/Modules/OPI_YandexDisk.os
+++ b/src/ru/OInt/core/Modules/OPI_YandexDisk.os
@@ -1,635 +1,635 @@
-// Расположение OS: ./OInt/core/Modules/OPI_YandexDisk.os
-// Библиотека: Yandex Disk
-// Команда CLI: yadisk
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:UsingServiceTag-off
-
-//@skip-check method-too-many-params
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools" 
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСФайламиИПапками
-
-// Получить информацию о диске
-// Получает информацию о текущем диске
-// 
-// Параметры:
-//  Токен - Строка - Токен - token
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьИнформациюОДиске(Знач Токен) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    Ответ     = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk", , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Создать папку
-// Создает каталог на диске
-// 
-// Параметры:
-//  Токен - Строка - Токен                     - token
-//  Путь  - Строка - Путь к созаваемой папке   - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    URL       = "https://cloud-api.yandex.net/v1/disk/resources";
-    Href      = "href";
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("path", Путь);
-    
-    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);    
-    Ответ     = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь);
-    
-    URLОтвета = Ответ[Href];  
-    
-    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
-    	Возврат Ответ;	
-    КонецЕсли;
-     
-    Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Получить объект
-// Получает информацию об объекте диска по заданному пути
-// 
-// Параметры:
-//  Токен - Строка - Токен                  - token
-//  Путь  - Строка - Путь к папке или файлу - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьОбъект(Знач Токен, Знач Путь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    Параметры = Новый Структура;
-    Параметры.Вставить("path", Путь);
-    
-    Ответ     = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Удалить объект
-// Удаляет объект по заданному пути
-// 
-// Параметры:
-//  Токен    - Строка - Токен                              - token
-//  Путь     - Строка - Путь к удаляемой папке или файлу   - path
-//  ВКорзину - Булево - В корзину                          - can
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач ВКорзину = Истина) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ВКорзину);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("path"       , Путь);
-    Параметры.Вставить("permanently", Не ВКорзину);
-    
-    Ответ     = OPI_Инструменты.Delete("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки);
-    
-    Возврат Ответ;
-
-КонецФункции
-
-// Создать копию объекта
-// Создает копию объекта по заданному пути и пути к оригиналу
-// 
-// Параметры:
-//  Токен          - Строка - Токен                                                   - token
-//  Оригинал       - Строка - Путь к оригинальному файлу или каталогу                 - from
-//  Путь           - Строка - Путь назначения для копии                               - to
-//  Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует  - rewrite
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция СоздатьКопиюОбъекта(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    URL       = "https://cloud-api.yandex.net/v1/disk/resources/copy";
-    Href      = "href";
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("from"       , Оригинал);
-    Параметры.Вставить("path"       , Путь);
-    Параметры.Вставить("overwrite"  , Перезаписывать);
-    
-    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
-    Ответ     = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
-    
-    URLОтвета = Ответ[Href]; 
-    
-    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
-	    Возврат Ответ;	
-    КонецЕсли;
-           
-    Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить ссылку для скачивания
-// Получает ссылку для скачивания файла
-// 
-// Параметры:
-//  Токен - Строка - Токен                         - token
-//  Путь  - Строка  - Путь к файлу для скачивания  - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьСсылкуДляСкачивания(Знач Токен, Знач Путь) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("path", Путь);
-    
-    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Параметры, Заголовки);
-    
-    Возврат Ответ;
-     
-КонецФункции
-
-// Скачать файл
-// Скачивает файл по указанному пути
-// 
-// Параметры:
-//  Токен          - Строка - Токен                        - token
-//  Путь           - Строка - Путь к файлу для скачивания  - path
-//  ПутьСохранения - Строка - Путь сохранения файла        - out 
-// 
-// Возвращаемое значение:
-//  ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения
-Функция СкачатьФайл(Знач Токен, Знач Путь, Знач ПутьСохранения = "") Экспорт
-	
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьСохранения);
-	Ответ  = ПолучитьСсылкуДляСкачивания(Токен, Путь);
-	URL    = Ответ["href"];
-	
-	Если Не ЗначениеЗаполнено(URL) Тогда
-		Возврат Ответ;
-	КонецЕсли;
-	
-	Ответ = OPI_Инструменты.Get(URL, , , ПутьСохранения);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить список файлов
-// Получает список файлов с или без отбора по типу
-// Список доступных типов: audio, backup, book, compressed, data, development, 
-//                         diskimage, document, encoded, executable, flash, font, 
-//                         mage, settings, spreadsheet, text, unknown, video, web
-//                                  
-// Параметры:
-//  Токен             - Строка       - Токен                                                - token
-//  Количество        - Число,Строка - Количество возвращаемых объектов                     - amount
-//  СмещениеОтНачала  - Число        - Смещение для получение объектов не из начала списка  - offset
-//  ОтборПоТипу       - Строка       - Отбор по типу файла                                  - type
-//  СортироватьПоДате - Булево       - Истина > сортировать по дате, Ложь > по алфавиту     - datesort
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьСписокФайлов(Знач Токен
-    , Знач Количество = 0
-    , Знач СмещениеОтНачала = 0
-    , Знач ОтборПоТипу = ""
-    , Знач СортироватьПоДате = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ОтборПоТипу);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(СортироватьПоДате);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    
-    Если ЗначениеЗаполнено(Количество) Тогда
-        Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество));
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
-        Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала));
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(ОтборПоТипу) Тогда
-        Параметры.Вставить("media_type", ОтборПоТипу);
-    КонецЕсли;
-    
-    Если СортироватьПоДате Тогда
-        Назначение = "last-uploaded";
-    Иначе
-        Назначение = "files";
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Назначение, Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Переместить объект
-// Перемещает объект по заданному пути и пути к оригиналу
-// 
-// Параметры:
-//  Токен          - Строка - Токен                                                   - token
-//  Оригинал       - Строка - Путь к оригинальному файлу или папке                    - from
-//  Путь           - Строка - Путь назначение для перемещения                         - to
-//  Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует  - rewrite
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПереместитьОбъект(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    URL       = "https://cloud-api.yandex.net/v1/disk/resources/move";
-    Href      = "href";
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("from"       , Оригинал);
-    Параметры.Вставить("path"       , Путь);
-    Параметры.Вставить("overwrite"  , Перезаписывать);
-    
-    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
-    Ответ     = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);  
-    URLОтвета = Ответ[Href]; 
-    
-    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
-    	Возврат Ответ;	
-    КонецЕсли;
-    
-    Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-    
-    Возврат Ответ;
-  
-КонецФункции
-
-// Загрузить файл
-// Загружает файл на диск по заданному пути
-// 
-// Параметры:
-//  Токен          - Строка                - Токен                                                      - token
-//  Путь           - Строка                - Путь для сохранение файла на Диске                         - path
-//  Файл           - Строка,ДвоичныеДанные - Файл для загрузки                                          - file
-//  Перезаписывать - Булево                - Перезаписывать, если файл с таким именем уже существует    - rewrite
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex 
-Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
-    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    Href      = "href";   
-    Файл      = Новый Структура("file", Файл);
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("path"       , Путь);
-    Параметры.Вставить("overwrite"  , Перезаписывать);
-    
-    Ответ  = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки);
-    URL    = Ответ[Href];
-    
-    Если Не ЗначениеЗаполнено(URL) Тогда
-    	Возврат Ответ;	
-    КонецЕсли;
-        
-    Ответ  = OPI_Инструменты.PutMultipart(URL, Новый Структура(), Файл, "multipart", Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Загрузить файл по URL
-// Загружает файл на диск, забирая его по заданному URL
-// 
-// Параметры:
-//  Токен - Строка - Токен                               - token
-//  Путь  - Строка - Путь помещения загруженного файла   - path
-//  Адрес - Строка - URL файла                           - url
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ЗагрузитьФайлПоURL(Знач Токен, Знач Путь, Знач Адрес) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    URL       = "https://cloud-api.yandex.net/v1/disk/resources/upload";
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("url" , КодироватьСтроку(Адрес, СпособКодированияСтроки.URLВКодировкеURL));
-    Параметры.Вставить("path", Путь);
-    
-    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
-    Ответ     = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
- 
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область УправлениеПубличнымДоступом
-
-// Опубликовать объект
-// Публикует объект диска в публичный доступ
-// 
-// Параметры:
-//  Токен - Строка - Токен                        - token
-//  Путь  - Строка - Путь к публикуемому объекту  - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex 
-Функция ОпубликоватьОбъект(Знач Токен, Знач Путь) Экспорт
-    Возврат ПереключениеОбщегоДоступа(Токен, Путь, Истина);   
-КонецФункции
-
-// Отменить публикацию объекта
-// Отменяет публикацию ранее опубликованного объекта
-// 
-// Параметры:
-//  Токен - Строка - Токен                                  - token
-//  Путь  - Строка - Путь к опубликованному ранее объекту   - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ОтменитьПубликациюОбъекта(Знач Токен, Знач Путь) Экспорт
-    Возврат ПереключениеОбщегоДоступа(Токен, Путь, Ложь);
-КонецФункции
-
-// Получить список опубликованных объектов.
-// Получает список опубликованных объектов
-// 
-// Параметры:
-//  Токен            - Строка - Токен                                               - token      
-//  Количество       - Число  - Количество возвращаемых объектов                    - amount
-//  СмещениеОтНачала - Число  - Смещение для получение объектов не из начала списка - offset
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьСписокОпубликованныхОбъектов(Знач Токен, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    
-    Если ЗначениеЗаполнено(Количество) Тогда
-        Параметры.Вставить("limit", Количество);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
-        Параметры.Вставить("offset", СмещениеОтНачала);
-    КонецЕсли;
-        
-    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить публичный объект
-// Получает информацию об опубликованном объекте по его URL
-// 
-// Параметры:
-//  Токен            - Строка - Токен                                                           - token
-//  URL              - Строка - Адрес объекта                                                   - url 
-//  Количество       - Число  - Количество возвращаемых вложенных объектов (для каталога)       - amount
-//  СмещениеОтНачала - Число  - Смещение для получение вложенных объектов не из начала списка   - offset
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьПубличныйОбъект(Знач Токен, Знач URL, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    
-    Если ЗначениеЗаполнено(Количество) Тогда
-        Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество));
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
-        Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала));
-    КонецЕсли;
-    
-    Параметры.Вставить("public_key", URL);
-        
-    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Параметры, Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Получить ссылку скачивания публичного объекта
-// Получает прямую ссылку для скачивания публичного объекта
-// 
-// Параметры:
-//  Токен - Строка - Токен               - token
-//  URL   - Строка - Адрес объекта       - url
-//  Путь  - Строка - Путь внутри объекта - path
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьСсылкуСкачиванияПубличногоОбъекта(Знач Токен, Знач URL, Знач Путь = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    
-    Заголовки = ЗаголовокАвторизации(Токен);
-    
-    Параметры = Новый Структура;
-    
-    Если ЗначениеЗаполнено(Путь) Тогда
-        Параметры.Вставить("path", Путь);
-    КонецЕсли;
-        
-    Параметры.Вставить("public_key", URL);
-        
-    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Параметры, Заголовки);
-    
-    Возврат Ответ; 
-    
-КонецФункции
-     
-// Сохранить публичный объект на диск
-// Сохраняет публичный объект на ваш диск
-// 
-// Параметры:
-//  Токен  - Строка - Токен                                               - token
-//  URL    - Строка - Адрес объекта                                       - url
-//  Откуда - Строка - Путь внутри публичного каталога (только для папок)  - from
-//  Куда   - Строка - Путь сохранения файла                               - to
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция СохранитьПубличныйОбъектНаДиск(Знач Токен, Знач URL, Откуда = "", Куда = "") Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
-    
-    Заголовки  = ЗаголовокАвторизации(Токен);
-    Адрес      = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk";
-    Href       = "href";
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("public_key", URL);
-    
-    Если ЗначениеЗаполнено(Откуда) Тогда
-        Параметры.Вставить("path", Откуда);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Куда) Тогда
-        Параметры.Вставить("save_path", Куда);
-    КонецЕсли;
-    
-    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
-    Ответ     = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь);
-    
-    URLОтвета = Ответ[Href]; 
-    
-    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
-        Возврат Ответ;	
-    КонецЕсли;
-        
-    Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
- 
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ЗаголовокАвторизации(Знач Токен)
-    
-    Заголовки = Новый Соответствие;
-    Заголовки.Вставить("Authorization", "OAuth " + Токен);
-    
-    Возврат Заголовки;
-    
-КонецФункции
-
-Функция ПереключениеОбщегоДоступа(Знач Токен, Знач Путь, Знач ОбщийДоступ) 
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-    OPI_ПреобразованиеТипов.ПолучитьБулево(ОбщийДоступ);
-    
-    Заголовки  = ЗаголовокАвторизации(Токен);
-    Назначение = ?(ОбщийДоступ, "publish", "unpublish");
-    Href       = "href";
-  
-    URL       = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение;
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("path", Путь);
-    
-    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
-    Ответ     = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь);
-    
-    URLОтвета = Ответ[Href];
-    
-    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
-        Возврат Ответ;	
-    КонецЕсли;    
-     
-    Ответ     = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_YandexDisk.os
+// Библиотека: Yandex Disk
+// Команда CLI: yadisk
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+
+//@skip-check method-too-many-params
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools" 
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСФайламиИПапками
+
+// Получить информацию о диске
+// Получает информацию о текущем диске
+// 
+// Параметры:
+//  Токен - Строка - Токен - token
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьИнформациюОДиске(Знач Токен) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    Ответ     = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk", , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Создать папку
+// Создает каталог на диске
+// 
+// Параметры:
+//  Токен - Строка - Токен                     - token
+//  Путь  - Строка - Путь к созаваемой папке   - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources";
+    Href      = "href";
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("path", Путь);
+    
+    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);    
+    Ответ     = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь);
+    
+    URLОтвета = Ответ[Href];  
+    
+    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+    	Возврат Ответ;	
+    КонецЕсли;
+     
+    Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Получить объект
+// Получает информацию об объекте диска по заданному пути
+// 
+// Параметры:
+//  Токен - Строка - Токен                  - token
+//  Путь  - Строка - Путь к папке или файлу - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьОбъект(Знач Токен, Знач Путь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    Параметры = Новый Структура;
+    Параметры.Вставить("path", Путь);
+    
+    Ответ     = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Удалить объект
+// Удаляет объект по заданному пути
+// 
+// Параметры:
+//  Токен    - Строка - Токен                              - token
+//  Путь     - Строка - Путь к удаляемой папке или файлу   - path
+//  ВКорзину - Булево - В корзину                          - can
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач ВКорзину = Истина) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ВКорзину);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("path"       , Путь);
+    Параметры.Вставить("permanently", Не ВКорзину);
+    
+    Ответ     = OPI_Инструменты.Delete("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки);
+    
+    Возврат Ответ;
+
+КонецФункции
+
+// Создать копию объекта
+// Создает копию объекта по заданному пути и пути к оригиналу
+// 
+// Параметры:
+//  Токен          - Строка - Токен                                                   - token
+//  Оригинал       - Строка - Путь к оригинальному файлу или каталогу                 - from
+//  Путь           - Строка - Путь назначения для копии                               - to
+//  Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует  - rewrite
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция СоздатьКопиюОбъекта(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources/copy";
+    Href      = "href";
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("from"       , Оригинал);
+    Параметры.Вставить("path"       , Путь);
+    Параметры.Вставить("overwrite"  , Перезаписывать);
+    
+    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
+    Ответ     = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
+    
+    URLОтвета = Ответ[Href]; 
+    
+    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+	    Возврат Ответ;	
+    КонецЕсли;
+           
+    Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить ссылку для скачивания
+// Получает ссылку для скачивания файла
+// 
+// Параметры:
+//  Токен - Строка - Токен                         - token
+//  Путь  - Строка  - Путь к файлу для скачивания  - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьСсылкуДляСкачивания(Знач Токен, Знач Путь) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("path", Путь);
+    
+    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Параметры, Заголовки);
+    
+    Возврат Ответ;
+     
+КонецФункции
+
+// Скачать файл
+// Скачивает файл по указанному пути
+// 
+// Параметры:
+//  Токен          - Строка - Токен                        - token
+//  Путь           - Строка - Путь к файлу для скачивания  - path
+//  ПутьСохранения - Строка - Путь сохранения файла        - out 
+// 
+// Возвращаемое значение:
+//  ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения
+Функция СкачатьФайл(Знач Токен, Знач Путь, Знач ПутьСохранения = "") Экспорт
+	
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьСохранения);
+	Ответ  = ПолучитьСсылкуДляСкачивания(Токен, Путь);
+	URL    = Ответ["href"];
+	
+	Если Не ЗначениеЗаполнено(URL) Тогда
+		Возврат Ответ;
+	КонецЕсли;
+	
+	Ответ = OPI_Инструменты.Get(URL, , , ПутьСохранения);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить список файлов
+// Получает список файлов с или без отбора по типу
+// Список доступных типов: audio, backup, book, compressed, data, development, 
+//                         diskimage, document, encoded, executable, flash, font, 
+//                         mage, settings, spreadsheet, text, unknown, video, web
+//                                  
+// Параметры:
+//  Токен             - Строка       - Токен                                                - token
+//  Количество        - Число,Строка - Количество возвращаемых объектов                     - amount
+//  СмещениеОтНачала  - Число        - Смещение для получение объектов не из начала списка  - offset
+//  ОтборПоТипу       - Строка       - Отбор по типу файла                                  - type
+//  СортироватьПоДате - Булево       - Истина > сортировать по дате, Ложь > по алфавиту     - datesort
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьСписокФайлов(Знач Токен
+    , Знач Количество = 0
+    , Знач СмещениеОтНачала = 0
+    , Знач ОтборПоТипу = ""
+    , Знач СортироватьПоДате = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ОтборПоТипу);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(СортироватьПоДате);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    
+    Если ЗначениеЗаполнено(Количество) Тогда
+        Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество));
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
+        Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала));
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(ОтборПоТипу) Тогда
+        Параметры.Вставить("media_type", ОтборПоТипу);
+    КонецЕсли;
+    
+    Если СортироватьПоДате Тогда
+        Назначение = "last-uploaded";
+    Иначе
+        Назначение = "files";
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Назначение, Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Переместить объект
+// Перемещает объект по заданному пути и пути к оригиналу
+// 
+// Параметры:
+//  Токен          - Строка - Токен                                                   - token
+//  Оригинал       - Строка - Путь к оригинальному файлу или папке                    - from
+//  Путь           - Строка - Путь назначение для перемещения                         - to
+//  Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует  - rewrite
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПереместитьОбъект(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources/move";
+    Href      = "href";
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("from"       , Оригинал);
+    Параметры.Вставить("path"       , Путь);
+    Параметры.Вставить("overwrite"  , Перезаписывать);
+    
+    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
+    Ответ     = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);  
+    URLОтвета = Ответ[Href]; 
+    
+    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+    	Возврат Ответ;	
+    КонецЕсли;
+    
+    Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+    
+    Возврат Ответ;
+  
+КонецФункции
+
+// Загрузить файл
+// Загружает файл на диск по заданному пути
+// 
+// Параметры:
+//  Токен          - Строка                - Токен                                                      - token
+//  Путь           - Строка                - Путь для сохранение файла на Диске                         - path
+//  Файл           - Строка,ДвоичныеДанные - Файл для загрузки                                          - file
+//  Перезаписывать - Булево                - Перезаписывать, если файл с таким именем уже существует    - rewrite
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex 
+Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
+    OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    Href      = "href";   
+    Файл      = Новый Структура("file", Файл);
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("path"       , Путь);
+    Параметры.Вставить("overwrite"  , Перезаписывать);
+    
+    Ответ  = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки);
+    URL    = Ответ[Href];
+    
+    Если Не ЗначениеЗаполнено(URL) Тогда
+    	Возврат Ответ;	
+    КонецЕсли;
+        
+    Ответ  = OPI_Инструменты.PutMultipart(URL, Новый Структура(), Файл, "multipart", Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Загрузить файл по URL
+// Загружает файл на диск, забирая его по заданному URL
+// 
+// Параметры:
+//  Токен - Строка - Токен                               - token
+//  Путь  - Строка - Путь помещения загруженного файла   - path
+//  Адрес - Строка - URL файла                           - url
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ЗагрузитьФайлПоURL(Знач Токен, Знач Путь, Знач Адрес) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources/upload";
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("url" , КодироватьСтроку(Адрес, СпособКодированияСтроки.URLВКодировкеURL));
+    Параметры.Вставить("path", Путь);
+    
+    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
+    Ответ     = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
+ 
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область УправлениеПубличнымДоступом
+
+// Опубликовать объект
+// Публикует объект диска в публичный доступ
+// 
+// Параметры:
+//  Токен - Строка - Токен                        - token
+//  Путь  - Строка - Путь к публикуемому объекту  - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex 
+Функция ОпубликоватьОбъект(Знач Токен, Знач Путь) Экспорт
+    Возврат ПереключениеОбщегоДоступа(Токен, Путь, Истина);   
+КонецФункции
+
+// Отменить публикацию объекта
+// Отменяет публикацию ранее опубликованного объекта
+// 
+// Параметры:
+//  Токен - Строка - Токен                                  - token
+//  Путь  - Строка - Путь к опубликованному ранее объекту   - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ОтменитьПубликациюОбъекта(Знач Токен, Знач Путь) Экспорт
+    Возврат ПереключениеОбщегоДоступа(Токен, Путь, Ложь);
+КонецФункции
+
+// Получить список опубликованных объектов.
+// Получает список опубликованных объектов
+// 
+// Параметры:
+//  Токен            - Строка - Токен                                               - token      
+//  Количество       - Число  - Количество возвращаемых объектов                    - amount
+//  СмещениеОтНачала - Число  - Смещение для получение объектов не из начала списка - offset
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьСписокОпубликованныхОбъектов(Знач Токен, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    
+    Если ЗначениеЗаполнено(Количество) Тогда
+        Параметры.Вставить("limit", Количество);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
+        Параметры.Вставить("offset", СмещениеОтНачала);
+    КонецЕсли;
+        
+    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить публичный объект
+// Получает информацию об опубликованном объекте по его URL
+// 
+// Параметры:
+//  Токен            - Строка - Токен                                                           - token
+//  URL              - Строка - Адрес объекта                                                   - url 
+//  Количество       - Число  - Количество возвращаемых вложенных объектов (для каталога)       - amount
+//  СмещениеОтНачала - Число  - Смещение для получение вложенных объектов не из начала списка   - offset
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьПубличныйОбъект(Знач Токен, Знач URL, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    
+    Если ЗначениеЗаполнено(Количество) Тогда
+        Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество));
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
+        Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала));
+    КонецЕсли;
+    
+    Параметры.Вставить("public_key", URL);
+        
+    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Параметры, Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Получить ссылку скачивания публичного объекта
+// Получает прямую ссылку для скачивания публичного объекта
+// 
+// Параметры:
+//  Токен - Строка - Токен               - token
+//  URL   - Строка - Адрес объекта       - url
+//  Путь  - Строка - Путь внутри объекта - path
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьСсылкуСкачиванияПубличногоОбъекта(Знач Токен, Знач URL, Знач Путь = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    
+    Заголовки = ЗаголовокАвторизации(Токен);
+    
+    Параметры = Новый Структура;
+    
+    Если ЗначениеЗаполнено(Путь) Тогда
+        Параметры.Вставить("path", Путь);
+    КонецЕсли;
+        
+    Параметры.Вставить("public_key", URL);
+        
+    Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Параметры, Заголовки);
+    
+    Возврат Ответ; 
+    
+КонецФункции
+     
+// Сохранить публичный объект на диск
+// Сохраняет публичный объект на ваш диск
+// 
+// Параметры:
+//  Токен  - Строка - Токен                                               - token
+//  URL    - Строка - Адрес объекта                                       - url
+//  Откуда - Строка - Путь внутри публичного каталога (только для папок)  - from
+//  Куда   - Строка - Путь сохранения файла                               - to
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция СохранитьПубличныйОбъектНаДиск(Знач Токен, Знач URL, Откуда = "", Куда = "") Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
+    
+    Заголовки  = ЗаголовокАвторизации(Токен);
+    Адрес      = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk";
+    Href       = "href";
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("public_key", URL);
+    
+    Если ЗначениеЗаполнено(Откуда) Тогда
+        Параметры.Вставить("path", Откуда);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Куда) Тогда
+        Параметры.Вставить("save_path", Куда);
+    КонецЕсли;
+    
+    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
+    Ответ     = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь);
+    
+    URLОтвета = Ответ[Href]; 
+    
+    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+        Возврат Ответ;	
+    КонецЕсли;
+        
+    Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+ 
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ЗаголовокАвторизации(Знач Токен)
+    
+    Заголовки = Новый Соответствие;
+    Заголовки.Вставить("Authorization", "OAuth " + Токен);
+    
+    Возврат Заголовки;
+    
+КонецФункции
+
+Функция ПереключениеОбщегоДоступа(Знач Токен, Знач Путь, Знач ОбщийДоступ) 
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+    OPI_ПреобразованиеТипов.ПолучитьБулево(ОбщийДоступ);
+    
+    Заголовки  = ЗаголовокАвторизации(Токен);
+    Назначение = ?(ОбщийДоступ, "publish", "unpublish");
+    Href       = "href";
+  
+    URL       = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение;
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("path", Путь);
+    
+    Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры); 
+    Ответ     = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь);
+    
+    URLОтвета = Ответ[Href];
+    
+    Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+        Возврат Ответ;	
+    КонецЕсли;    
+     
+    Ответ     = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_YandexID.os b/src/ru/OInt/core/Modules/OPI_YandexID.os
similarity index 98%
rename from ru/OInt/core/Modules/OPI_YandexID.os
rename to src/ru/OInt/core/Modules/OPI_YandexID.os
index 053dc4e64e..10d9cc743b 100644
--- a/ru/OInt/core/Modules/OPI_YandexID.os
+++ b/src/ru/OInt/core/Modules/OPI_YandexID.os
@@ -1,112 +1,112 @@
-// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os
-// Библиотека: Yandex ID
-// Команда CLI: yandex
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-// Получить код подтверждения
-// Получает код подтверждения и адрес страницы, на которой его необходимо ввести
-// 
-// Параметры:
-//  ClientId - Строка - Client id - id
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт
-
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
-    
-    Параметры = Новый Структура("client_id", ClientId);
-    Ответ     = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Преобразовать код в токен
-// Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения
-// 
-// Параметры:
-//  ClientId      - Строка - Client id                                 - id
-//  ClientSecret  - Строка - Client secret                             - secret
-//  КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства);
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("grant_type"    , "device_code");
-    Параметры.Вставить("code"          , КодУстройства);
-    Параметры.Вставить("client_id"     , ClientId);
-    Параметры.Вставить("client_secret" , ClientSecret);
-    
-    Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-// Обновить токен
-// Обновляет токен по Refresh token
-// 
-// Параметры:
-//  ClientId     - Строка - Client id      - id
-//  ClientSecret - Строка - Client secret  - secret
-//  RefreshToken - Строка - Refresh token  - refresh
-// 
-// Возвращаемое значение:
-//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт
-    
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
-    OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
-    
-    Параметры = Новый Структура;
-    Параметры.Вставить("grant_type"    , "refresh_token");
-    Параметры.Вставить("refresh_token" , RefreshToken);
-    Параметры.Вставить("client_id"     , ClientId);
-    Параметры.Вставить("client_secret" , ClientSecret);
-    
-    Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
-    
-    Возврат Ответ;
-    
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os
+// Библиотека: Yandex ID
+// Команда CLI: yandex
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+// Получить код подтверждения
+// Получает код подтверждения и адрес страницы, на которой его необходимо ввести
+// 
+// Параметры:
+//  ClientId - Строка - Client id - id
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт
+
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
+    
+    Параметры = Новый Структура("client_id", ClientId);
+    Ответ     = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Преобразовать код в токен
+// Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения
+// 
+// Параметры:
+//  ClientId      - Строка - Client id                                 - id
+//  ClientSecret  - Строка - Client secret                             - secret
+//  КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства);
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("grant_type"    , "device_code");
+    Параметры.Вставить("code"          , КодУстройства);
+    Параметры.Вставить("client_id"     , ClientId);
+    Параметры.Вставить("client_secret" , ClientSecret);
+    
+    Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+// Обновить токен
+// Обновляет токен по Refresh token
+// 
+// Параметры:
+//  ClientId     - Строка - Client id      - id
+//  ClientSecret - Строка - Client secret  - secret
+//  RefreshToken - Строка - Refresh token  - refresh
+// 
+// Возвращаемое значение:
+//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт
+    
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
+    OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
+    
+    Параметры = Новый Структура;
+    Параметры.Вставить("grant_type"    , "refresh_token");
+    Параметры.Вставить("refresh_token" , RefreshToken);
+    Параметры.Вставить("client_id"     , ClientId);
+    Параметры.Вставить("client_secret" , ClientSecret);
+    
+    Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
+    
+    Возврат Ответ;
+    
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os b/src/ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os
similarity index 100%
rename from ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os
rename to src/ru/OInt/coverage/Modules/Coverage_ОпределениеПокрытия.os
diff --git a/ru/OInt/coverage/data/genericCoverage.xml b/src/ru/OInt/coverage/data/genericCoverage.xml
similarity index 100%
rename from ru/OInt/coverage/data/genericCoverage.xml
rename to src/ru/OInt/coverage/data/genericCoverage.xml
diff --git a/ru/OInt/lib.config b/src/ru/OInt/lib.config
similarity index 98%
rename from ru/OInt/lib.config
rename to src/ru/OInt/lib.config
index 6747b15fc1..742bdb7b7c 100644
--- a/ru/OInt/lib.config
+++ b/src/ru/OInt/lib.config
@@ -1,20 +1,20 @@
-<package-def>
-    <module name="OPI_GoogleCalendar" file="core/Modules/OPI_GoogleCalendar.os"/>
-    <module name="OPI_Инструменты" file="tools/Modules/internal/Modules/OPI_Инструменты.os"/>
-    <module name="OPI_Notion" file="core/Modules/OPI_Notion.os"/>
-    <module name="OPI_Telegram" file="core/Modules/OPI_Telegram.os"/>
-    <module name="OPI_GoogleDrive" file="core/Modules/OPI_GoogleDrive.os"/>
-    <module name="OPI_ПолучениеДанныхТестов" file="tools/Modules/OPI_ПолучениеДанныхТестов.os"/>
-    <module name="OPI_Twitter" file="core/Modules/OPI_Twitter.os"/>
-    <module name="OPI_Viber" file="core/Modules/OPI_Viber.os"/>
-    <module name="OPI_ПреобразованиеТипов" file="tools/Modules/OPI_ПреобразованиеТипов.os"/>
-    <module name="OPI_GoogleWorkspace" file="core/Modules/OPI_GoogleWorkspace.os"/>
-    <module name="OPI_YandexDisk" file="core/Modules/OPI_YandexDisk.os"/>
-    <module name="OPI_Dropbox" file="core/Modules/OPI_Dropbox.os"/>
-    <module name="OPI_Airtable" file="core/Modules/OPI_Airtable.os"/>
-    <module name="OPI_Slack" file="core/Modules/OPI_Slack.os"/>
-    <module name="OPI_GoogleSheets" file="core/Modules/OPI_GoogleSheets.os"/>
-    <module name="OPI_YandexID" file="core/Modules/OPI_YandexID.os"/>
-    <module name="OPI_VK" file="core/Modules/OPI_VK.os"/>
-    <module name="OPI_Криптография" file="tools/Modules/internal/Modules/OPI_Криптография.os"/>
-</package-def>
+<package-def>
+    <module name="OPI_GoogleCalendar" file="core/Modules/OPI_GoogleCalendar.os"/>
+    <module name="OPI_Инструменты" file="tools/Modules/internal/Modules/OPI_Инструменты.os"/>
+    <module name="OPI_Notion" file="core/Modules/OPI_Notion.os"/>
+    <module name="OPI_Telegram" file="core/Modules/OPI_Telegram.os"/>
+    <module name="OPI_GoogleDrive" file="core/Modules/OPI_GoogleDrive.os"/>
+    <module name="OPI_ПолучениеДанныхТестов" file="tools/Modules/OPI_ПолучениеДанныхТестов.os"/>
+    <module name="OPI_Twitter" file="core/Modules/OPI_Twitter.os"/>
+    <module name="OPI_Viber" file="core/Modules/OPI_Viber.os"/>
+    <module name="OPI_ПреобразованиеТипов" file="tools/Modules/OPI_ПреобразованиеТипов.os"/>
+    <module name="OPI_GoogleWorkspace" file="core/Modules/OPI_GoogleWorkspace.os"/>
+    <module name="OPI_YandexDisk" file="core/Modules/OPI_YandexDisk.os"/>
+    <module name="OPI_Dropbox" file="core/Modules/OPI_Dropbox.os"/>
+    <module name="OPI_Airtable" file="core/Modules/OPI_Airtable.os"/>
+    <module name="OPI_Slack" file="core/Modules/OPI_Slack.os"/>
+    <module name="OPI_GoogleSheets" file="core/Modules/OPI_GoogleSheets.os"/>
+    <module name="OPI_YandexID" file="core/Modules/OPI_YandexID.os"/>
+    <module name="OPI_VK" file="core/Modules/OPI_VK.os"/>
+    <module name="OPI_Криптография" file="tools/Modules/internal/Modules/OPI_Криптография.os"/>
+</package-def>
diff --git a/ru/OInt/packagedef b/src/ru/OInt/packagedef
similarity index 97%
rename from ru/OInt/packagedef
rename to src/ru/OInt/packagedef
index 24c3199fdc..9c0ce97c17 100644
--- a/ru/OInt/packagedef
+++ b/src/ru/OInt/packagedef
@@ -1,13 +1,13 @@
-Описание.Имя("oint")
-    .Версия("1.9.0")
-    .Автор("bayselonarrend")
-    .АдресАвтора("bayselonarrend@gmail.com")
-    .Описание("Открытый пакет интеграций с популярными API")
-    .ВерсияСреды("1.0.7")
-    .ВключитьФайл("core")
-    .ВключитьФайл("tools")
-    .ВключитьФайл("tests")
-    .ВключитьФайл("lib.config")
-    .ВключитьФайл("../README.MD")
-    .ВключитьФайл("../LICENSE")
-    .ЗависитОт("asserts", "1.3.0")
+Описание.Имя("oint")
+    .Версия("1.9.0")
+    .Автор("bayselonarrend")
+    .АдресАвтора("bayselonarrend@gmail.com")
+    .Описание("Открытый пакет интеграций с популярными API")
+    .ВерсияСреды("1.0.7")
+    .ВключитьФайл("core")
+    .ВключитьФайл("tools")
+    .ВключитьФайл("tests")
+    .ВключитьФайл("lib.config")
+    .ВключитьФайл("../README.MD")
+    .ВключитьФайл("../LICENSE")
+    .ЗависитОт("asserts", "1.3.0")
diff --git a/ru/OInt/tests/Modules/Coverage_ЗапускВсехТестов.os b/src/ru/OInt/tests/Modules/Coverage_ЗапускВсехТестов.os
similarity index 100%
rename from ru/OInt/tests/Modules/Coverage_ЗапускВсехТестов.os
rename to src/ru/OInt/tests/Modules/Coverage_ЗапускВсехТестов.os
diff --git a/ru/OInt/tests/Modules/internal/OPI_Тесты.os b/src/ru/OInt/tests/Modules/internal/OPI_Тесты.os
similarity index 98%
rename from ru/OInt/tests/Modules/internal/OPI_Тесты.os
rename to src/ru/OInt/tests/Modules/internal/OPI_Тесты.os
index b47c90b90c..e9233bdb73 100644
--- a/ru/OInt/tests/Modules/internal/OPI_Тесты.os
+++ b/src/ru/OInt/tests/Modules/internal/OPI_Тесты.os
@@ -1,5307 +1,5307 @@
-// Расположение OS: ./OInt/tests/Modules/internal/OPI_Тесты.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// Набор тестов для YAxUnit
-
-// BSLLS:Typo-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UsingServiceTag-off
-// BSLLS:UnusedParameters-off
-// BSLLS:DuplicateStringLiteral-off
-
-// @skip-check undefined-variable
-// @skip-check wrong-string-literal-content
-
-// Раскомментировать, если выполняется OneScript
-#Использовать oint
-#Использовать asserts
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-// Для YaxUnit
-
-Процедура ИсполняемыеСценарии() Экспорт
-
-    OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс();
-
-КонецПроцедуры
-
-// Для Asserts
-
-Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
-
-   Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс();
-
-КонецФункции
-
-#Область ЗапускаемыеТесты
-
-#Область Telegram
-
-Процедура Телеграм_ПолучитьИнформациюБота() Экспорт
- 
- 	ПараметрыТеста = Новый Структура;
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
- 	
-	Telegram_ПолучитьИнформациюБота(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура Телеграм_ПолучитьОбновления() Экспорт
-
- 	ПараметрыТеста = Новый Структура;
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
- 	
- 	Telegram_УдалитьWebhook(ПараметрыТеста);
-	Telegram_ПолучитьОбновления(ПараметрыТеста);
-	
-КонецПроцедуры
-
-Процедура Телеграм_УстановитьWebhook() Экспорт
-
- 	ПараметрыТеста = Новый Структура;
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_URL"  , ПараметрыТеста);
-
-	Telegram_УстановитьWebhook(ПараметрыТеста);
-	Telegram_УдалитьWebhook(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьТекстовоеСообщение() Экспорт
-
-    ПараметрыТеста = Новый Структура;
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
- 	
-	Telegram_ОтправитьТекстовоеСообщение(ПараметрыТеста);
-        
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьКартинку() Экспорт
-
-    ПараметрыТеста = Новый Структура;
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture"           , ПараметрыТеста);
- 	
-	Telegram_ОтправитьКартинку(ПараметрыТеста);
-	Telegram_СкачатьФайл(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьВидео() Экспорт
-
-    ПараметрыТеста = Новый Структура;
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
- 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video"             , ПараметрыТеста);
- 	
-	Telegram_ОтправитьВидео(ПараметрыТеста);
-	Telegram_СкачатьФайл(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьАудио() Экспорт
-
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Audio"             , ПараметрыТеста);
-    
-    Telegram_ОтправитьАудио(ПараметрыТеста);
-    Telegram_СкачатьФайл(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьДокумент() Экспорт
-
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document"          , ПараметрыТеста);
-    
-    Telegram_ОтправитьДокумент(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьГифку() Экспорт
-
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF"               , ПараметрыТеста);
-    
-    Telegram_ОтправитьГифку(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьМедиагруппу() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture"           , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video"             , ПараметрыТеста);
-    
-    Telegram_ОтправитьМеидагруппу(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьМестоположение() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Long"              , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Lat"               , ПараметрыТеста);
-    
-    Telegram_ОтправитьМестоположение(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьКонтакт() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Name"              , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Surname"           , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Phone"             , ПараметрыТеста);
-
-    Telegram_ОтправитьКонтакт(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьОпрос() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    
-	Telegram_ОтправитьОпрос(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ПереслатьСообщение() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"           , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"          , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID"       , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста);
-
-	Telegram_ПереслатьСообщение(ПараметрыТеста);
-        
-КонецПроцедуры
-
-Процедура Телеграм_БанРазбан() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"           , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"          , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID"       , ПараметрыТеста);
-    
-    Telegram_Бан(ПараметрыТеста);
-    Telegram_Разбан(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура Телеграм_СоздатьСсылкуПриглашение() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    
-	Telegram_СоздатьСсылкуПриглашение(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ЗакрепитьОткрепитьСообщение() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"           , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID"       , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста);
-        
-	Telegram_ЗакрепитьСообщение(ПараметрыТеста);
-	Telegram_ОткрепитьСообщение(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ПолучитьЧислоУчастников() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-    
-    Telegram_ПолучитьЧислоУчастников(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
-    
-	Telegram_ПолучитьСписокАватаровФорума(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"  , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture"         , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"          , ПараметрыТеста);
-    
-	Telegram_СоздатьТемуФорума(ПараметрыТеста);
-	Telegram_ИзменитьТемуФорума(ПараметрыТеста);
-	Telegram_ЗакрытьТемуФорума(ПараметрыТеста);
-	Telegram_ОткрытьТемуФорума(ПараметрыТеста);
-	Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыТеста);
-	Telegram_УдалитьТемуФорума(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_СкрытьПоказатьГлавнуюТему() Экспорт
- 
- 	ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"  , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
-
-	Telegram_СкрытьГлавнуюТемуФорума(ПараметрыТеста);
-	Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ИзменитьИмяГлавнойТемы() Экспорт
- 
- 	ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"  , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
-
-	Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыТеста);
-	
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область VK
-
-Процедура ВК_СоздатьСсылкуТокена() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("VK_AppID", ПараметрыТеста);
-
-    VK_СоздатьСсылкуПолученияТокена(ПараметрыТеста);  
-    
-КонецПроцедуры
-
-Процедура ВК_СоздатьУдалитьПост() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2", ПараметрыТеста);
-    
-    VK_СоздатьПост(ПараметрыТеста);
-    VK_УдалитьПост(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьСоставнойПост() Экспорт
-    
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video"   , ПараметрыТеста);
-    
-    VK_СоздатьСоставнойПост(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура ВК_СоздатьОпрос() Экспорт
- 
-    VK_СоздатьОпрос();
-       
-КонецПроцедуры
-
-Процедура ВК_СохранитьУдалитьКартинку() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
-    
-    VK_СоздатьАльбом(ПараметрыТеста);
-    VK_СохранитьКартинкуВАльбом(ПараметрыТеста);
-    VK_УдалитьКартинку(ПараметрыТеста);
-    VK_УдалитьАльбом(ПараметрыТеста);
-           
-КонецПроцедуры
-
-Процедура ВК_СоздатьИсторию() Экспорт
- 
-    ПараметрыТеста = Новый Соответствие;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
-    
-    VK_СоздатьИсторию(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура ВК_МетодыОбсуждений() Экспорт
- 
-    ПараметрыТеста = Новый Структура;
-    Параметры      = ПолучитьПараметрыВК();
-    
-    VK_СоздатьОбсуждение(ПараметрыТеста);
-    VK_ЗакрытьОбсуждение(ПараметрыТеста);
-    VK_ОткрытьОбсуждение(ПараметрыТеста);
-    VK_НаписатьВОбсуждение(ПараметрыТеста);     
-       
-    OPI_VK.ЗакрытьОбсуждение(ПараметрыТеста["VK_ConvID"], Истина, Параметры);
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура ВК_ЛайкРепостКоммент() Экспорт
- 
-    Параметры       = ПолучитьПараметрыВК();
-    Текст           = "Пост из автотеста";
-    Сообщение       = "Сообщение из автотеста";
-    ТипСоответствие = Тип("Соответствие");
-    ТипЧисло        = Тип("Число");
-    Response        = "response";
-    
-    Результат = OPI_VK.СоздатьПост(Текст, Новый Массив, , , Параметры);
-    
-    ИДПоста   = Результат[Response]["post_id"];    
-    Результат = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк");
-    
-    OPI_Инструменты.Пауза(5);
-      
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено();
-        
-    ВнешнийПост  = 2571;
-    ВнешняяСтена = -218704372;
-        
-    Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1); 
-        
-    Результат  = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьКомментарий");
-        
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["comment_id"]).ИмеетТип(ТипЧисло).Заполнено();
-   
-    OPI_VK.УдалитьПост(ИДПоста, Параметры);
-    OPI_VK.УдалитьПост(Результат[Response]["post_id"], Параметры);
-    
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСтатистику() Экспорт
- 
-    ТекущаяДата     = OPI_Инструменты.ПолучитьТекущуюДату();
-    Параметры       = ПолучитьПараметрыВК();
-    Дата0           = НачалоДня(ТекущаяДата);
-    Дата1           = КонецДня(Дата0);
-    ТипСоответствие = Тип("Соответствие");
-     
-    Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено();
-    
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСтатистикуПостов() Экспорт
- 
-    Параметры    = ПолучитьПараметрыВК();
-    
-    МассивПостов = Новый Массив;
-    МассивПостов.Добавить(214);
-    МассивПостов.Добавить(215);
-    
-    Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры);
-
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2);
-    
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьРекламнуюКампанию() Экспорт
- 
-    Параметры       = ПолучитьПараметрыВК();
-    ИДКабинета      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID");
-    Наименование    = "Тестовая кампания";
-    ТипСоответствие = Тип("Соответствие");
-    ТипЧисло        = Тип("Число");
-    Response        = "response";
-    UID             = "id";
-        
-    Результат    = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию");
-    
-    Результат    = Результат[Response][0];
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
-        
-    ИДКампании  = Результат[UID];
-    ИДКатегории = 126;
-    Лимит       = 150;
-    
-    Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры); 
-    ИДПоста   = Результат[Response]["post_id"]; 
-        
-    Результат   = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании
-        , Лимит
-        , ИДКатегории
-        , ИДПоста
-        , ИДКабинета
-        , Параметры);
-        
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление");
-            
-    Результат   = Результат[Response][0];
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
-        
-    ИДОбъявления = Результат[UID];
-    Результат    = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление");
-    
-    Результат    = Результат[Response][0];
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
- 
-    OPI_VK.УдалитьПост(ИДПоста, Параметры);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ВК_ОтправитьСообщение() Экспорт
- 
-    Параметры    = ПолучитьПараметрыВК();
-    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID");
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken");
-    Текст        = "Сообщение из автотеста";
-    
-    МассивКнопок = Новый Массив;
-    МассивКнопок.Добавить("Кнопка 1");
-    МассивКнопок.Добавить("Кнопка 2"); 
-    
-    Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок);
-    Результат  = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); 
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();
-    
-    OPI_Инструменты.Пауза(5);
-  
-КонецПроцедуры
-
-Процедура ВК_ПолучитьКатегорииТоваров() Экспорт
- 
-    Параметры = ПолучитьПараметрыВК();
-    Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
-        .ИмеетТип("Соответствие")
-        .Заполнено();
-        
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ВК_СоздатьТоварПодборку() Экспорт
- 
-    Параметры       = ПолучитьПараметрыВК();
-    ТипСоответствие = Тип("Соответствие");
-    ТипЧисло        = Тип("Число");
-    Response        = "response";
-    Картинка        = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
-    ИВФ             = ПолучитьИмяВременногоФайла("png");   
-    Картинка.Записать(ИВФ);
-        
-    Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
-        , Картинка
-        , Истина
-        , Ложь
-        , Параметры);  
-        
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено();
-             
-    ИДПодборки = Результат[Response]["market_album_id"];
-    
-    Результат  = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПодборкуТоваров");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Равно(1);
- 
-    МассивКартинок = Новый Массив;
-    МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"));
-    МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2"));
-    
-    Товар = Новый Соответствие();
-    Товар.Вставить("Имя"                , "Тестовый товар");    
-    Товар.Вставить("Описание"           , "Описание товара");
-    Товар.Вставить("Категория"          , "20173");           
-    Товар.Вставить("Цена"               , 1);                
-    Товар.Вставить("СтараяЦена"         , 15);     
-    Товар.Вставить("ОсновноеФото"       , Картинка);                   
-    Товар.Вставить("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
-    Товар.Вставить("ДополнительныеФото" , МассивКартинок);     
-    Товар.Вставить("ГлавныйВГруппе"     , Истина);                 
-    Товар.Вставить("Ширина"             , 20);     
-    Товар.Вставить("Высота"             , 30);     
-    Товар.Вставить("Глубина"            , 40);     
-    Товар.Вставить("Вес"                , 100);
-    Товар.Вставить("SKU"                , "12345");
-    Товар.Вставить("ДоступныйОстаток"   , "10");
-    
-    Результат = OPI_VK.ДобавитьТовар(Товар, ИДПодборки, Параметры);                // Добавление товара
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено();
-        
-    ИДТовара  = Результат[Response]["market_item_id"];
-    
-    Товар = Новый Соответствие;
-    Товар.Вставить("Имя", "Тестовый товар измененный");
-    
-    Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры);                // Изменение товара
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар");
-    
-    Проверка_ВКИстина(Результат);
-    
-    Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры);    // Добавление в подборку
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено();
-        
-    Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры);    // Удаляет из подборки
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки");
-    
-    OPI_Инструменты.Пауза(5);
-    Проверка_ВКИстина(Результат);
-        
-    Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры);                          // Удаление товара
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар");
-    
-    OPI_Инструменты.Пауза(5);
-    Проверка_ВКИстина(Результат);
-        
-    Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры);                     // Уадление подборки
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку");
-    
-    OPI_Инструменты.Пауза(5);
-    Проверка_ВКИстина(Результат);
-
-    УдалитьФайлы(ИВФ);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ВК_СоздатьТоварСоСвойствами() Экспорт
- 
-    Параметры       = ПолучитьПараметрыВК();
-    ТипСоответствие = Тип("Соответствие");
-    ТипЧисло        = Тип("Число");
-    MII             = "market_item_id";
-    Response        = "response";
-    Желтый          = "Желтый";
-    Красный         = "Красный";
-    Картинка        = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
-    ИВФ             = ПолучитьИмяВременногоФайла("png");   
-    Картинка.Записать(ИВФ);
-    
-    МассивВариантов = Новый Массив;
-    МассивВариантов.Добавить(Желтый);
-    МассивВариантов.Добавить("Синий");
-    МассивВариантов.Добавить(Красный);
-    
-    Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    Свойство  = Результат[Response]["property_id"];
-    Свойство  = OPI_Инструменты.ЧислоВСтроку(Свойство);
-     
-    СоответствиеСвойств = Новый Соответствие;
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено();
-        
-    Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    Проверка_ВКИстина(Результат);
-   
-    Для Каждого Вариант Из МассивВариантов Цикл
-        
-        Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры);
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара");
-        
-        OPI_Инструменты.Пауза(5);
-        
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено();
-            
-        ИДВарианта = Результат[Response]["variant_id"];
-        СоответствиеСвойств.Вставить(Вариант, ИДВарианта);
-        
-        Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор())
-            , Свойство
-            , ИДВарианта
-            , Параметры);
-            
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара");
-        
-    Проверка_ВКИстина(Результат);
-              
-    КонецЦикла;
-  
-    МассивКартинок = Новый Массив;
-    МассивКартинок.Добавить(ИВФ);
-    МассивКартинок.Добавить(Картинка);
-    
-    Товар = Новый Соответствие();
-    Товар.Вставить("Имя"                , "Тестовый товар (" + Желтый + ")");    
-    Товар.Вставить("Описание"           , "Описание товара");
-    Товар.Вставить("Категория"          , "20173");           
-    Товар.Вставить("Цена"               , 1);                
-    Товар.Вставить("СтараяЦена"         , 15);     
-    Товар.Вставить("ОсновноеФото"       , Картинка);                   
-    Товар.Вставить("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
-    Товар.Вставить("ДополнительныеФото" , МассивКартинок);     
-    Товар.Вставить("ГлавныйВГруппе"     , Истина);             
-    Товар.Вставить("НомерГруппы"        , Неопределено);      
-    Товар.Вставить("Ширина"             , 20);     
-    Товар.Вставить("Высота"             , 30);     
-    Товар.Вставить("Глубина"            , 40);     
-    Товар.Вставить("Вес"                , 100);
-    Товар.Вставить("SKU"                , 12345);
-    Товар.Вставить("ДоступныйОстаток"   , "10");
-    Товар.Вставить("ЗначенияСвойств"    , СоответствиеСвойств[Желтый]);
-    
-    Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры);                // Добавление товара  
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    ИДЖелтого = Результат[Response]["market_item_id"];               
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
-        
-    Товар.Вставить("Имя"            , "Тестовый товар (" + Красный + ")");
-    Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]);
-
-    Результат  = OPI_VK.ДобавитьТовар(Товар, , Параметры);                // Добавление товара
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
-      
-    OPI_Инструменты.Пауза(5);
-    
-    ИДКрасного = Результат[Response][MII];               
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
-        
-    МассивТоваров = Новый Массив;
-    МассивТоваров.Добавить(ИДЖелтого);
-    МассивТоваров.Добавить(ИДКрасного);
-    
-    Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2);
-        
-    Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено();
-       
-    OPI_VK.УдалитьТовар(ИДЖелтого , Параметры);
-    OPI_VK.УдалитьТовар(ИДКрасного, Параметры);
-    
-    Для Каждого Вариант Из СоответствиеСвойств Цикл
-        
-        Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры);
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара");
-        
-        OPI_Инструменты.Пауза(5);
-        Проверка_ВКИстина(Удаление);
-        
-    КонецЦикла;
-        
-    Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры);
-   
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСвойствоТовара");
-        
-    OPI_Инструменты.Пауза(5);
-    
-    Проверка_ВКИстина(Удаление);
-
-    УдалитьФайлы(ИВФ);
-    
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСписокТоваров() Экспорт
- 
-    Параметры = ПолучитьПараметрыВК();
-    Картинка  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); 
-    
-    МассивКартинок = Новый Массив;
-    МассивКартинок.Добавить(Картинка);
-    
-    Товар = Новый Соответствие();
-    Товар.Вставить("Имя"                , "Тестовый товар 2");    
-    Товар.Вставить("Описание"           , "Описание товара");
-    Товар.Вставить("Категория"          , "20173");           
-    Товар.Вставить("Цена"               , 1);                
-    Товар.Вставить("СтараяЦена"         , 15);     
-    Товар.Вставить("ОсновноеФото"       , Картинка);                   
-    Товар.Вставить("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
-    Товар.Вставить("ДополнительныеФото" , МассивКартинок);     
-    Товар.Вставить("ГлавныйВГруппе"     , Истина);             
-    Товар.Вставить("НомерГруппы"        , Неопределено);      
-    Товар.Вставить("Ширина"             , 20);     
-    Товар.Вставить("Высота"             , 30);     
-    Товар.Вставить("Глубина"            , 40);     
-    Товар.Вставить("Вес"                , 100);
-    Товар.Вставить("SKU"                , 12345);
-    Товар.Вставить("ДоступныйОстаток"   , "10");
-    
-    Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры);
-    ИДТовара  = Результат["response"]["market_item_id"];
-    OPI_Инструменты.Пауза(5);
-    
-    Результат = OPI_VK.ПолучитьСписокТоваров(, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
-        .ИмеетТип("Массив").Заполнено();
-              
-    OPI_VK.УдалитьТовар(ИДТовара, Параметры);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСписокПодборок() Экспорт
- 
-    Параметры = ПолучитьПараметрыВК();
-    Картинка  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");    
-    Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
-        , Картинка
-        , Истина
-        , Ложь
-        , Параметры); 
-     
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
-       
-    ИДПодборки = Результат["response"]["market_album_id"];      
-    Результат  = OPI_VK.ПолучитьСписокПодборок(Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
-        .ИмеетТип("Массив").Заполнено();
-        
-    OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); 
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСписокСвойств() Экспорт
- 
-    Параметры  = ПолучитьПараметрыВК();
-    Результат  = OPI_VK.ПолучитьСписокСвойств(Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
-        .ИмеетТип("Массив").Заполнено();
-        
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСписокЗаказов() Экспорт
- 
-    Параметры  = ПолучитьПараметрыВК();
-    Результат  = OPI_VK.ПолучитьСписокЗаказов(Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
-        .ИмеетТип("Массив").Заполнено();
-        
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ВК_ЗагрузитьВидео() Экспорт
-    
-    Параметры    = ПолучитьПараметрыВК();
-    Видео        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video");
-    Наименование = "Новое видео";
-    Описание     = "Описание видео";
-    
-    Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено();
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область YandexDisk
-
-Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт
- 
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    Соответствие = "Соответствие";
-    
-    Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ЯДиск_СоздатьПапку() Экспорт
- 
-   Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-   Путь  = "/" + Строка(Новый УникальныйИдентификатор);
-   
-   Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь);
-   
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
-   
-   OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-   OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("dir");
-   OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
-        
-   OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-  
-   OPI_Инструменты.Пауза(5);
-  
-КонецПроцедуры
-
-Процедура ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект() Экспорт
- 
-    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    Путь  = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
-    URL   = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
-
-    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
-    OPI_Инструменты.Пауза(5);
-        
-    Результат = OPI_YandexDisk.ПолучитьОбъект(Токен, Путь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
-
-     OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-     
-     OPI_Инструменты.Пауза(5);
-     
-КонецПроцедуры
-
-Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт
- 
-    Токен    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    Путь     = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
-    Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
-    ИВФ      = ПолучитьИмяВременногоФайла("png");
-    Картинка.Записать(ИВФ);
-
-    Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
-    
-    Проверка_Пусто(Результат);
-    OPI_Инструменты.Пауза(5);
-    
-    Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
-    
-    Проверка_Пусто(Результат);
-    
-    Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
-    
-    Проверка_Пусто(Результат);
-    OPI_Инструменты.Пауза(5);
-    
-    Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
-    
-    Проверка_Пусто(Результат);   
-
-    УдалитьФайлы(ИВФ);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ЯДиск_СоздатьКопиюОбъекта() Экспорт
- 
-    Токен           = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    ПутьОригинала   = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
-    ПутьКопии       = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
-    URL             = "https://raw.githubusercontent.com/Bayselonarrend/"
-        + "OpenIntegrations/main/Media/logo.png";
-
-    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL);
-    OPI_Инструменты.Пауза(5);
-      
-    Результат = OPI_YandexDisk.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКопиюОбъекта");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии);
-
-     OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь);
-     OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь);
-     
-     OPI_Инструменты.Пауза(5);
-     
-КонецПроцедуры
-
-Процедура ЯДиск_ПолучитьСсылкуНаСкачивание() Экспорт
- 
-    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    Путь  = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
-    URL   = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
-
-    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
-    OPI_Инструменты.Пауза(5);
-       
-    Результат = OPI_YandexDisk.ПолучитьСсылкуДляСкачивания(Токен, Путь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
-    
-    URL = Результат["href"];
-    
-    Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено();
-
-    OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт
- 
-    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    Количество = 2;
-    Отступ     = 1;
-    
-    Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image");
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ЯДиск_ПереместитьОбъект() Экспорт
- 
-    Токен           = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    ПутьОригинала   = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
-    ПутьКопии       = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
-    URL             = "https://raw.githubusercontent.com/Bayselonarrend/"
-        + "OpenIntegrations/main/Media/logo.png";
-
-    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL);
-    OPI_Инструменты.Пауза(15);
-      
-    Результат = OPI_YandexDisk.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьОбъект");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии);
-
-    OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь);
-    OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь);
-    
-    OPI_Инструменты.Пауза(5);
-     
-КонецПроцедуры
-
-Процедура ЯДиск_ДействияПубличныхОбъектов() Экспорт
- 
-    PUrl         = "public_url";
-    Соответствие = "Соответствие";
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    Путь         = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
-    URL          = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
-    
-    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
-    OPI_Инструменты.Пауза(5);
-    
-    МассивРезультатов = Новый Массив;
-    
-    МассивРезультатов.Добавить(OPI_YandexDisk.ОпубликоватьОбъект(Токен, Путь)); 
-    ПубличныйURL      = МассивРезультатов[0][PUrl];
-    
-    Результат  = OPI_YandexDisk.ПолучитьСсылкуСкачиванияПубличногоОбъекта(Токен, ПубличныйURL);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта");
-              
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
-    
-    Результат   = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/");
-    
-    МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL));
-                
-    МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь));
-    
-    Счетчик = 0;
-    Для Каждого Результат Из МассивРезультатов Цикл
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации");
-            
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено();
-            
-        Если Счетчик = 0 Тогда   
-            OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено();
-        Иначе
-            OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено");
-        КонецЕсли;
-        
-        Счетчик = Счетчик + 1;
-        
-    КонецЦикла;
-     
-    OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-    
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт
- 
-    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
-    Количество = 2;
-    Отступ     = 1;
-    
-    Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Viber
-
-Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт
- 
-    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");    
-    Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале");
-        
-    Проверка_ВайберОк(Результат);
-
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт
- 
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); 
-    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-    Результат    = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено();
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт
- 
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); 
-    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
-    Результат    = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив");
-    Проверка_ВайберОк(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт
- 
-    Текст         = "Тестовое сообщение";
-    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
-    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
-    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
-    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-    
-    МассивКнопок  = Новый Массив;
-    МассивКнопок.Добавить("Кнопка 1");
-    МассивКнопок.Добавить("Кнопка 2");
-    МассивКнопок.Добавить("Кнопка 3");
-    
-    Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок);
- 
-    Результат  = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    Результат  = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьКартинку() Экспорт
-
-    Текст         = "Тестовое сообщение";
-    Картинка      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
-    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
-    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
-    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
-    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-     
-    Результат  = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    Результат  = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьФайл() Экспорт
-  
-    Документ      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
-    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
-    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
-    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
-    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-       
-    Результат  = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx");
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    Результат  = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx");
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьКонтакт() Экспорт
- 
-    Имя           = "Петр Петров";
-    Телефон       = "+123456789";
-    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
-    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
-    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
-    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-         
-    Результат  = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    Результат  = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьЛокацию() Экспорт
-
-    Широта        = "48.87373649724122";
-    Долгота       = "2.2954639195323967";
-    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
-    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
-    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
-    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-         
-    Результат  = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    Результат  = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьСсылку() Экспорт
-
-    URL           = "https://github.com/Bayselonarrend/OpenIntegrations";
-    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
-    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
-    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
-    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-         
-    Результат  = OPI_Viber.ОтправитьСсылку(ТокенБота, URL, Пользователь, Ложь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    Результат  = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
-    Проверка_ВайберОк(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область GoogleWorkspace
-
-Процедура ГВ_ПолучитьСсылкуАвторизации() Экспорт
- 
-    ClientID  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");    
-    Результат = OPI_GoogleWorkspace.СформироватьСсылкуПолученияКода(ClientID);
-            
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
-        .ИмеетТип("Строка") 
-        .Заполнено();
-        
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Link", Результат);
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура ГВ_ПолучитьТокен() Экспорт
- 
-    ClientID      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
-    ClientSecret  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret");
-    Code          = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Code");
-    
-    Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code);
-           
-    Если ЗначениеЗаполнено(Результат["access_token"])
-        И ЗначениеЗаполнено(Результат["refresh_token"]) Тогда
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token"  , Результат["access_token"]);
-        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Refresh", Результат["refresh_token"]);
-    
-    КонецЕсли;
-    
-    OPI_Инструменты.Пауза(5);
-      
-КонецПроцедуры
-
-Процедура ГВ_ОбновитьТокен() Экспорт
- 
-    ClientID      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
-    ClientSecret  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret");
-    RefreshToken  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Refresh");
-    
-    Результат = OPI_GoogleWorkspace.ОбновитьТокен(ClientID, ClientSecret, RefreshToken);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");                
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено();
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token", Результат["access_token"]);
-    
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область GoogleCalendar
-
-Процедура ГК_ПолучитьСписокКалендарей() Экспорт
- 
-    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");    
-    Результат = OPI_GoogleCalendar.ПолучитьСписокКалендарей(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
-        .ИмеетТип("Массив");
-
-    OPI_Инструменты.Пауза(5);
-            
-КонецПроцедуры
-
-Процедура ГК_СоздатьУдалитьКалендарь() Экспорт
- 
-    Токен                   = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); 
-    Наименование            = "Тестовый календарь";
-    Описание                = "Тестовое описание";
-    НаименованиеИзмененное  = Наименование + " (изм.)";
-    ТипСоответствие         = Тип("Соответствие");
-    ТипСтрока               = Тип("Строка");
-    Summary                 = "summary";
-    Черный                  = "#000000";
-    Желтый                  = "#ffd800";
-    
-    Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование); 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено();
-        
-    Календарь = Результат["id"];
-    
-    Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен
-        , Календарь
-        , НаименованиеИзмененное
-        , Описание);
-        
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря");
-    
-    Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
-        
-    Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря");  
-    
-    Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
-
-    Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок");
-    
-    Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
-    
-    Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
-        
-    Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
-
-    Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь");
-    
-    Проверка_Пусто(Результат);
-    
-    Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка");
-    
-    Проверка_Пусто(Результат);
-    
-    Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарь");
-    
-    Проверка_Пусто(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ГК_СоздатьУдалитьСобытие() Экспорт
- 
-    ТекущаяДата     = OPI_Инструменты.ПолучитьТекущуюДату();
-    Токен           = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); 
-    Календарь       = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
-    Наименование    = "Новое событие";
-    Описание        = "Описание тестового события";
-    ОписаниеИзм     = "Описание тестового события (изм.)";
-    UID             = "id";
-    Час             = 3600;
-
-    Вложения        = Новый Соответствие;
-    
-    Вложения.Вставить("Картинка1"
-        , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png");
-    Вложения.Вставить("Картинка2"
-        , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1");
-    
-    СоответствиеСобытия = Новый Соответствие;
-    СоответствиеСобытия.Вставить("Описание"                 , Описание);
-    СоответствиеСобытия.Вставить("Заголовок"                , Наименование);
-    СоответствиеСобытия.Вставить("МестоПроведения"          , "В офисе");
-    СоответствиеСобытия.Вставить("ДатаНачала"               , ТекущаяДата);
-    СоответствиеСобытия.Вставить("ДатаОкончания"            , СоответствиеСобытия["ДатаНачала"] + Час);
-    СоответствиеСобытия.Вставить("МассивURLФайловВложений"  , Вложения);
-    СоответствиеСобытия.Вставить("ОтправлятьУведомления"    , Истина);
-    
-    Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие");
-    
-    Событие   = Результат[UID];
-    
-    Проверка_ГКОбъект(Результат, Наименование, Описание);
-      
-    СоответствиеСобытия = Новый Соответствие;  
-    СоответствиеСобытия.Вставить("Описание", ОписаниеИзм);
-    
-    Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие");
-    
-    Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
-        
-    Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие");
-    
-    Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
-
-    Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие");
-    
-    Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
-  
-    Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие");
-       
-    Проверка_Пусто(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГК_ПолучитьСписокСобытий() Экспорт
- 
-    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");    
-    Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
-
-    Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив");
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область GoogleDrive
-
-Процедура ГД_ПолучитьСписокКаталогов() Экспорт
- 
-    MimeType  = "mimeType";
-    Name      = "name";
-    Имя       = "Тестовая папка";
-    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
-    Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов");
-    
-    Результат = Результат[0];
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
-    
-    OPI_Инструменты.Пауза(5);
-    Идентификатор = Результат["id"];
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор);
-    
-    Результат   = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
-    
-    OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт
- 
-    ЛишниеБайты = 2;
-    
-    Kind      = "kind";
-    Content   = "content";
-    MIME      = "MIME";
-    MimeType  = "mimeType";
-    Name      = "name";
-    Id_       = "id";
-    
-    МассивУдаляемых = Новый Массив;
-    Токен           = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
-    Картинка        = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
-    КартинкаЗамены  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2");
-    Каталог         = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
-    
-    Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла();
-    Описание.Вставить("Родитель", Каталог);
-   
-    Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]);
-
-    Идентификатор = Результат[Id_];
-    МассивУдаляемых.Добавить(Идентификатор);
-    
-    НовоеИмя  = "Скопированный файл.jpeg";
-    Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root");
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект");
-    
-    OPI_Инструменты.Пауза(5);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
-       
-    МассивУдаляемых.Добавить(Результат[Id_]);
-    
-    Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты);
-    OPI_Инструменты.Пауза(5);
-    
-    НовоеИмя  = "Обновленный файл.jpg";
-    Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
-
-    OPI_Инструменты.Пауза(5);
-    
-    Комментарий = "Yo";
-    Результат   = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
-  
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
-    
-    OPI_Инструменты.Пауза(5);
-     
-    Для Каждого Удаляемый Из МассивУдаляемых Цикл
-        Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый);    
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
-      
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
-        OPI_Инструменты.Пауза(2);
-    КонецЦикла;
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура ГД_СоздатьУдалитьКомментарий() Экспорт
-    
-    Kind      = "kind";
-    Content   = "content";
-    Id_       = "id";
-    Comments  = "comments";
-    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
-    Каталог   = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
-    Картинка  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
-    
-    Описание  = OPI_GoogleDrive.ПолучитьОписаниеФайла();
-    Описание.Вставить("Родитель", Каталог);
-    
-    Результат     = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
-    Идентификатор = Результат[Id_];
-    
-    Комментарий         = "Новый комментарий";
-    МассивРезультатов   = Новый Массив;
-    Результат           = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
-    
-    ИДКомментария       = Результат[Id_];
-    
-    МассивРезультатов.Добавить(Результат);
-    
-    Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий");
-    
-    МассивРезультатов.Добавить(Результат);
-    
-    Результат         = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев");
-    
-    Комментарии       = Результат[Comments];
-    ОбъектКомментарий = Комментарии[Комментарии.ВГраница()];
-    
-    МассивРезультатов.Добавить(ОбъектКомментарий);
-    
-    Для Каждого Результат Из МассивРезультатов Цикл     
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
-    КонецЦикла;
-    
-    Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария);    
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
-
-    OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор);
-        
-КонецПроцедуры
-
-Процедура ГД_СоздатьКаталог() Экспорт
-    
-    Name       = "name";
-    Имя        = "Тестовая папка";
-    Токен      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
-    Каталог    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
-    
-    МассивРезультатов = Новый Массив;
-    
-    МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя));
-    МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог));
-    
-    Для Каждого Результат Из МассивРезультатов Цикл
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
-        
-        ИДКаталога = Результат["id"];
-                
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя);
-        
-        OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога);
-        
-    КонецЦикла;
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область GoogleSheets
-
-Процедура ГТ_СоздатьТаблицу() Экспорт
-    
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
-    Наименование = "Тестовая таблица";
-    
-    МассивЛистов = Новый Массив;
-    МассивЛистов.Добавить("Лист1");
-    МассивЛистов.Добавить("Лист2");
-    
-    Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКнигу");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование);
-
-    Для Н = 0 По МассивЛистов.ВГраница() Цикл
-        
-        ИмяЛиста = Результат["sheets"][Н]["properties"]["title"];
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(ИмяЛиста).Равно(МассивЛистов[Н]);
-        Лист = Результат["sheets"][Н]["properties"]["sheetId"];
-        Лист = OPI_Инструменты.ЧислоВСтроку(Лист);
-        
-    КонецЦикла;
-    
-    Книга   = Результат["spreadsheetId"];
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Spreadsheet", Книга);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Sheet"      , Лист);
-    
-    Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
-    Книга2  = Результат["spreadsheetId"];
-    
-    Результат = OPI_GoogleSheets.КопироватьЛист(Токен, Книга, Книга2, Лист);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист");
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)");
-    
-    Наименование = "Тестовый лист";
-        
-    Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист");
-
-    НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"];
-    НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); 
-
-    Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-    
-    Наименование = "Тестовая таблица (изм.)";
-    
-    Результат    = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-    
-КонецПроцедуры
-
-Процедура ГТ_ПолучитьТаблицу() Экспорт
-    
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
-    Книга        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
-    Наименование = "Тестовая таблица (изм.)";
-
-    Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицу");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование);
-
-КонецПроцедуры
-
-Процедура ГТ_ЗаполнитьОчиститьЯчейки() Экспорт
-    
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
-    Книга        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
-    Лист         = "Лист2";
-
-    СтруктураЯчеек = Новый Соответствие;
-    СтруктураЯчеек.Вставить("A1", "Это A1");
-    СтруктураЯчеек.Вставить("A2", "Это A2");
-    СтруктураЯчеек.Вставить("B2", "Это B2");
-    СтруктураЯчеек.Вставить("B3", "Это B3");
-    СтруктураЯчеек.Вставить("A3", "Это A3");
-    СтруктураЯчеек.Вставить("A4", "Это A4");
-    СтруктураЯчеек.Вставить("B1", "Это B1");
-    СтруктураЯчеек.Вставить("B4", "Это B4");
-    
-    МассивЯчеек = Новый Массив;
-    МассивЯчеек.Добавить("B2");
-    МассивЯчеек.Добавить("A3");
-    МассивЯчеек.Добавить("B4");
-
-    Результат = OPI_GoogleSheets.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество());
-    
-    Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество());
-    
-    Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-    
-    МассивЯчеек = Новый Массив;
-    МассивЯчеек.Добавить("B2");
-    МассивЯчеек.Добавить("A3");
-    МассивЯчеек.Добавить("B4");
-
-    Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьЯчейки");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["clearedRanges"].Количество()).Равно(МассивЯчеек.Количество());
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Twitter
-
-Процедура Твиттер_ПолучитьСсылкуАвторизации() Экспорт
- 
-    Параметры = ПолучитьПараметрыТвиттер();
-    Результат = OPI_Twitter.ПолучитьСсылкуАвторизации(Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_URL", Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Твиттер_ОбновитьТокен() Экспорт
- 
-    Параметры = ПолучитьПараметрыТвиттер();
-    Результат = OPI_Twitter.ОбновитьТокен(Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["refresh_token"]).Заполнено();
-        
-    Рефреш = Результат["refresh_token"];
-    Токен  = Результат["access_token"];
-    
-    Если ЗначениеЗаполнено(Рефреш) И Не Рефреш = "null" Тогда   
-        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Refresh", Рефреш);
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(Токен) И Не Токен = "null" Тогда
-        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Token"  , Токен);
-    КонецЕсли;
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТекстовыйТвит() Экспорт
- 
-    Параметры = ПолучитьПараметрыТвиттер();
-    Текст     = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
-    
-    Результат = OPI_Twitter.СоздатьТекстовыйТвит(Текст, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит");
-    
-    Проверка_ТвиттерТекст(Результат, Текст);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт
- 
-    Параметры = ПолучитьПараметрыТвиттер();
-    Текст     = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
-    Картинка  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
-    ИВФ       = ПолучитьИмяВременногоФайла("png");
-    Картинка.Записать(ИВФ);
-   
-    Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры); 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
-    
-    Проверка_ТвиттерТекст(Результат, Текст);    
-    
-    Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
-    
-    Проверка_ТвиттерТекст(Результат, Текст);
-    
-    УдалитьФайлы(ИВФ);
-    
-    OPI_Инструменты.Пауза(20);
-    
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТвитСВидео() Экспорт
- 
-    Параметры = ПолучитьПараметрыТвиттер();
-    Текст     = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
-    Видео     = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video");
-    ИВФ       = ПолучитьИмяВременногоФайла("mp4");
-    Видео.Записать(ИВФ);
-   
-    Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры);    
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
-    
-    Проверка_ТвиттерТекст(Результат, Текст);    
-    
-    Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
-    
-    Проверка_ТвиттерТекст(Результат, Текст);
-    
-    УдалитьФайлы(ИВФ);
-    
-    OPI_Инструменты.Пауза(20);
-    
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТвитСГиф() Экспорт
- 
-    Параметры = ПолучитьПараметрыТвиттер();
-    Текст     = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
-    Гифка     = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF");
-    ИВФ       = ПолучитьИмяВременногоФайла("gif");
-    Гифка.Записать(ИВФ);
-   
-    Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры);   
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
-     
-    Проверка_ТвиттерТекст(Результат, Текст);    
-    
-    Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
-    
-    Проверка_ТвиттерТекст(Результат, Текст);
-    
-    УдалитьФайлы(ИВФ);
-    
-    OPI_Инструменты.Пауза(20);
-    
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТвитСОпросом() Экспорт
- 
-    Параметры       = ПолучитьПараметрыТвиттер();
-    Текст           = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
-    МассивОтветов   = Новый Массив;
-    МассивОтветов.Добавить("Вариант 1");
-    МассивОтветов.Добавить("Вариант 2");
-   
-    Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры);
- 
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос");
-    
-    Проверка_ТвиттерТекст(Результат, Текст);
-    
-    OPI_Инструменты.Пауза(20);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Notion
-
-Процедура Ноушн_СоздатьСтраницу() Экспорт
-	
-	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	Родитель  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
-	Заголовок = "Тестовый заголовок";
-	 
-	Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницу");
-    
-    Проверка_НоушнОбъект(Результат);
-
-КонецПроцедуры
-
-Процедура Ноушн_СоздатьИзменитьБазу() Экспорт
-	
-	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	Родитель  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
-	Заголовок = "Тестовый заголовок";
-	
-	Свойства = Новый Соответствие;
-	Свойства.Вставить("Имя"            , "title");
-	Свойства.Вставить("Описание"       , "rich_text");
-	Свойства.Вставить("Номер"          , "number");
-	Свойства.Вставить("Статус"         , "status");
-	Свойства.Вставить("Дата создания"  , "date");
-	Свойства.Вставить("Картинка"       , "files");
-	Свойства.Вставить("Активен"        , "checkbox");
-	Свойства.Вставить("Сайт"           , "url");
-	Свойства.Вставить("Почта"          , "email");
-	Свойства.Вставить("Телефон"        , "phone_number");
-	Свойства.Вставить("Пользователь"   , "people");
-	
-	ВыборЗначения = Новый Соответствие;
-	ВыборЗначения.Вставить("Новый", "green");
-	ВыборЗначения.Вставить("В работе", "yellow");
-	ВыборЗначения.Вставить("Удаленный", "red");
-	Свойства.Вставить("Статус", ВыборЗначения);
-	
-	Результат = OPI_Notion.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства); 
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных");
-    
-    Проверка_НоушнОбъект(Результат, "database");
-    
-    База      = Результат["id"];
-    Заголовок = "Тестовый заголовок";
-	Описание  = "Тестовое описание";
-	
-	Свойства = Новый Соответствие;
-	Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст
-	Свойства.Вставить("Сайт");               // Поле "Сайт" будет удалено
-	
-	Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы");
-    
-    Проверка_НоушнОбъект(Результат, "database");
-
-КонецПроцедуры
-
-Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт
-	
-	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	Страница  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
-	
-	Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу");
-    
-    Проверка_НоушнОбъект(Результат);	
-    
-КонецПроцедуры
-
-Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт
-
-	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	База      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
-		
-	Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных");
-    
-    Проверка_НоушнОбъект(Результат, "database");
-    
-КонецПроцедуры
-
-Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт
-	
-	Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	База  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
-	
-	Картинка = Новый Соответствие;
-	Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"));
-	
-	Свойства = Новый Соответствие;
-	Свойства.Вставить("Имя"            , "ООО Вектор");
-	Свойства.Вставить("Описание"       , "Наш первый клиент");
-	Свойства.Вставить("Номер"          , 1);
-	Свойства.Вставить("Статус"         , "Обычный");
-	Свойства.Вставить("Дата создания"  , OPI_Инструменты.ПолучитьТекущуюДату());
-	Свойства.Вставить("Картинка"       , Картинка);
-	Свойства.Вставить("Активен"        , Истина);
-	Свойства.Вставить("Сайт"           , "https://vector.ru");
-	Свойства.Вставить("Почта"          , "mail@vector.ru");
-	Свойства.Вставить("Телефон"        , "88005553535");
-	Свойства.Вставить("Статус"	       , "Новый");
-	
-	Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу");
-    
-    Проверка_НоушнОбъект(Результат);
-    
-    Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", "");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База);
-       	 
-КонецПроцедуры
-
-Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт
-	
-	Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	Страница     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
-	Иконка       = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
-	Обложка      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2");
-	Архивировать = Ложь;
-	
-	Свойства = Новый Соответствие;
-	Свойства.Вставить("Активен"     , Ложь);
-	Свойства.Вставить("Почта"       , "vector@mail.ru");
-	
-	Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен
-		, Страница
-		, Свойства
-		, Иконка
-		, Обложка
-		, Архивировать);
-          
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы");
-    
-    Проверка_НоушнОбъект(Результат);
-    
-КонецПроцедуры
-
-Процедура Ноушн_СоздатьУдалитьБлок() Экспорт
-	
-	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	Родитель  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
-	Блок      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block");
-	
-	Результат = OPI_Notion.ВернутьБлок(Токен, Блок);	
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок");
-    
-    Проверка_НоушнОбъект(Результат, "block");
-    
-	Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок");
-    
-    Проверка_НоушнОбъект(Результат, "list");
-    
-    Блок      = Результат["results"][0]["id"];
-	Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки");
-    
-    Проверка_НоушнОбъект(Результат, "list");
-    
-	Результат = OPI_Notion.УдалитьБлок(Токен, Блок);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок");
-    
-    Проверка_НоушнОбъект(Результат, "block");
-    
-КонецПроцедуры
-
-Процедура Ноушн_ПолучитьПользователей() Экспорт
-	
-	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	Результат = OPI_Notion.СписокПользователей(Токен);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей");
-    
-    Проверка_НоушнОбъект(Результат, "list");
-    
-КонецПроцедуры
-
-Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт
-	
-	Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
-	Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User"); 
-	Результат    = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь);
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
-    
-    Проверка_НоушнОбъект(Результат, "user");
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Slack
-
-Процедура Слак_ПолучитьИнформациюОБоте() Экспорт
-    
-    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено();
-    
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокПользователей() Экспорт
-    
-    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Результат = OPI_Slack.ПолучитьСписокПользователей(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
-    
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокОбластей() Экспорт
-    
-    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив");
-    
-КонецПроцедуры
-
-Процедура Слак_ОтправитьУдалитьСообщение() Экспорт
-
-    Токен    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); 
-    Канал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-    Текст    = "Тестовое сообщение 1";
-    Текст2   = "Тестовое сообщение 2";
-    Отметки  = Новый Массив;
-    Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
-    
-    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст);
-    
-    Отметка = Результат["ts"];
-    
-    Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2);
-        
-    Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
-    
-    Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено();
-        
-    Проверка_СлакОк(Результат);
-      
-    Отметки.Добавить(Отметка);
-    
-    МассивБлоков = Новый Массив;
-    Блок         = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
-    МассивБлоков.Добавить(Блок);
-    
-    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-    
-    Отметки.Добавить(Результат["ts"]);
-    
-    Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
-    БлокJSON = OPI_Инструменты.JSONСтрокой(Блок);
-    
-    ИВФ = ПолучитьИмяВременногоФайла("json");
-    
-    ТекстовыйДокумент = Новый ТекстовыйДокумент();
-    ТекстовыйДокумент.УстановитьТекст(БлокJSON);
-    ТекстовыйДокумент.Записать(ИВФ);
-        
-    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-    
-    Отметки.Добавить(Результат["ts"]);
-    
-    Блоки = "['" + ИВФ + "','" + ИВФ + "']";
-    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-    
-    Отметки.Добавить(Результат["ts"]);
-
-    УдалитьФайлы(ИВФ);
- 
-    Для Каждого Отметка Из Отметки Цикл
-        
-        Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка);
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
-
-        Проверка_СлакОк(Результат);
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-    
-    КонецЦикла;
-    
-    Час       = 3600;
-    Сутки     = 24;
-    Отправка  = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час);
-    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено();
-    
-    Отметка   = Результат["scheduled_message_id"];
-    Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
-
-    Проверка_СлакОк(Результат);
-
-КонецПроцедуры
-
-Процедура Слак_ОтправитьУдалитьЭфемерное() Экспорт
-   
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); 
-    Канал        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
-    Картинка     = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
-    Текст        = "Тестовое сообщение 1";
-    
-    Блок      = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
-    Результат = OPI_Slack.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено();
-     
-КонецПроцедуры
-
-Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт
-    
-    Токен    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); 
-    Канал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-    
-    Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив");
-   
-КонецПроцедуры
-
-Процедура Слак_СоздатьАрхивироватьКанал() Экспорт
-    
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
-    Имя          = "testconv" + Строка(Новый УникальныйИдентификатор);
-    Тема         = "Тестовая тема";
-    Цель         = "Тестовая цель";
-    
-    #Область СоздатьКанал
-    Результат = OPI_Slack.СоздатьКанал(Токен, Имя);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал");
-    
-    Данные = Результат["channel"];
-    Канал  = Данные["id"];
-
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
-    #КонецОбласти
-
-    #Область УстановитьТемуКанала
-    Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала");
-    
-    Данные = Результат["channel"];
-    Канал  = Данные["id"];
-
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема);
-    #КонецОбласти
-    
-    #Область УстановитьЦельКанала
-    Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала");
-    
-    Проверка_СлакОк(Результат);
-    #КонецОбласти
-    
-    #Область ПолучитьКанал
-    Результат = OPI_Slack.ПолучитьКанал(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал");
-    
-    Данные = Результат["channel"];
-    Канал  = Данные["id"];
-
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
-    #КонецОбласти
-    
-    #Область ПригласитьПользователейВКанал
-    Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал");
-    
-    Данные = Результат["channel"];
-    Канал  = Данные["id"];
-
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
-    #КонецОбласти
-    
-    #Область ВыгнатьПользователяИзКанала
-    Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала");
-    
-    Проверка_СлакОк(Результат);
-    #КонецОбласти
-    
-    #Область ПолучитьИсториюКанала
-    Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала");
-        
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
-    #КонецОбласти
-    
-    #Область ПолучитьСписокПользователейКанала
-    Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала");
-        
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
-    #КонецОбласти
-
-    #Область ПокинутьКанал
-    Результат = OPI_Slack.ПокинутьКанал(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал");
-    
-    Проверка_СлакОк(Результат);
-    #КонецОбласти
-    
-    #Область ВступитьВКанал
-    Результат = OPI_Slack.ВступитьВКанал(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал");
-    
-    Данные = Результат["channel"];
-    Канал  = Данные["id"];
-
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
-    #КонецОбласти
-    
-    #Область ПереименоватьКанал
-    НовоеИмя  = "testconv" + Строка(Новый УникальныйИдентификатор);
-    Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал");
-    
-    Данные = Результат["channel"];
-    Канал  = Данные["id"];
-
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя);
-    #КонецОбласти
-    
-    #Область АрхивироватьКанал
-    Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал");
-    
-    Проверка_СлакОк(Результат);
-    #КонецОбласти
-    
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокКаналов() Экспорт
-    
-    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    
-    Результат = OPI_Slack.ПолучитьСписокКаналов(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов");
-
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив");
-    
-КонецПроцедуры
-
-Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт
-    
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
-    Текст        = "Yo, dude";
-    
-    Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог");
-
-    Диалог = Результат["channel"]["id"];
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено();
-    
-    Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
-    
-    Проверка_СлакОк(Результат);
-
-    Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог");
-
-    Проверка_СлакОк(Результат);
-
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокФайлов() Экспорт
-    
-    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-    
-    Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
-
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт
-    
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Файл         = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document");
-    Канал        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-    МассивФайлов = Новый Массив;
-    ИмяФайла     = "megadoc.docx";
-    Заголовок    = "Новый файл";
-    
-    Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
-
-    ЗагруженныйФайл = Результат["files"][0];
-    МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
-    
-    Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)");
-
-    ЗагруженныйФайл = Результат["files"][0];
-    МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
-    
-    Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл");
-    
-    ЗагруженныйФайл = Результат["file"];
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
-        
-    Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл
-        
-        Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл);
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл");
-        
-        Проверка_СлакОк(Результат);
-        
-    КонецЦикла;
-
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокВФ() Экспорт
-    
-    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-    
-    Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
-    
-    Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
-    
-КонецПроцедуры
-
-Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт
-    
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-    Файл         = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
-    Канал        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-    Заголовок    = "Новый файл";
-    
-    Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл");
-    
-    ЗагруженныйФайл = Результат["file"];
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
-    
-    Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл");
-    
-    ЗагруженныйФайл = Результат["file"];
-    
-    Проверка_СлакОк(Результат);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
-    
-    Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
-    
-    Проверка_СлакОк(Результат);
-    
-    Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
-    
-    Проверка_СлакОк(Результат);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Airtable
-
-Процедура АТ_СоздатьБазу() Экспорт
-    
-    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
-    Область      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace");
-    Наименование = "Тестовая база";
-    
-    МассивПолей = Новый Массив;
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
-    
-    ИмяТаблицы = "Тестовая таблица";
-    
-    СоответствиеТаблиц = Новый Соответствие;
-    СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей);
-    
-    Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы);
-    
-    База = Результат["id"];
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База);
-    
-    Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив");
-
-    Результат = OPI_Airtable.ПолучитьСписокБаз(Токен);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив");
- 
-КонецПроцедуры
-
-Процедура АТ_СоздатьТаблицу() Экспорт
-    
-    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
-    База  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
-    
-    МассивПолей = Новый Массив;
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера");
-    
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое");
-    
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение"));
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения");
-    
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок"));
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка");
-    
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата"));
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты");
-    
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон"));
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона");
-        
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта"));
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты");    
-    
-    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка"));
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки");    
-    
-    ИмяТаблицы = "Тестовая таблица 2";
-    Описание   = "Новая таблица";
-    
-    Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
-    
-    Таблица    = Результат["id"];
-    ИмяТаблицы = "Тестовая таблица 2 (изм.)";
-    Описание   = "Новая таблица (изм.)";
-   
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица);
-    
-    Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
-
-КонецПроцедуры
-
-Процедура АТ_СоздатьПоле() Экспорт
-    
-    Токен   = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
-    База    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
-    Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
-    Имя     = Строка(Новый УникальныйИдентификатор);
-    
-    Поле = OPI_Airtable.ПолучитьПолеНомера(Имя);
-    
-    Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
-    
-    Поле      = Результат["id"]; 
-    Имя       = Имя + "(изм.)";
-    Описание  = "Новое описание";
-    
-    Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
-    
-КонецПроцедуры
-
-Процедура АТ_СоздатьУдалитьЗаписи() Экспорт
-
-    Токен   = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
-    База    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
-    Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
-    
-    Числовой = 10;
-    Строчный = "Привет";
-    
-    ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный);
-    ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный);
-    
-    МассивУдаляемых = Новый Массив;
-    МассивОписаний  = Новый Массив;
-    МассивОписаний.Добавить(ОписаниеСтроки1);
-    МассивОписаний.Добавить(ОписаниеСтроки2);
-    
-    Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний);
-
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2);
-    
-    Для Каждого Запись Из Результат["records"] Цикл
-        МассивУдаляемых.Добавить(Запись["id"]);
-    КонецЦикла;
-        
-    Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)");
-    
-    ОдиночнаяЗапись = Результат["id"];
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный);
-  
-    Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись);
-    
-    Текст     = "Тестовый комментарий";
-    Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
-    
-    Коммент   = Результат["id"];
-    Текст     = "Тестовый комментарий (изм.)";
-    Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
-    
-    Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив");
-    
-    Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент);
-     
-    Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
-    
-    Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
-      
-    Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
-        
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Dropbox
-
-Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт
-    
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appkey"   , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appsecret", ПараметрыТеста);
-   
-    Dropbox_ПолучитьСсылкуАвторизации(ПараметрыТеста); 
-    
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Code", ПараметрыТеста);
-
-    Dropbox_ПолучитьТокен(ПараметрыТеста);
-    
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Refresh", ПараметрыТеста);
-    
-    Dropbox_ОбновитьТокен(ПараметрыТеста);
-       
-КонецПроцедуры
-
-Процедура ДропБокс_ЗагрузитьФайл() Экспорт
-    
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста);
-    
-    Dropbox_ЗагрузитьФайл(ПараметрыТеста);
-    Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыТеста);
-    Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыТеста);
-    Dropbox_ВосстановитьОбъектКВерсии(ПараметрыТеста);
-    Dropbox_ПолучитьПревью(ПараметрыТеста);
-    Dropbox_СкачатьФайл(ПараметрыТеста);
-    Dropbox_ПереместитьОбъект(ПараметрыТеста);
-    Dropbox_КопироватьОбъект(ПараметрыТеста);
-    Dropbox_УдалитьОбъект(ПараметрыТеста);
-        
-КонецПроцедуры
-
-Процедура ДропБокс_СоздатьКаталог() Экспорт
-    
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-    
-    Dropbox_СоздатьПапку(ПараметрыТеста);
-    Dropbox_СкачатьПапку(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура ДропБокс_ПолучитьСписокФайловПапки() Экспорт
-    
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-    
-    Dropbox_ПолучитьСписокФайловПапки(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура ДропБокс_ЗагрузитьФайлПоURL() Экспорт
-    
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document", ПараметрыТеста);
-    
-    Dropbox_ЗагрузитьФайлПоURL(ПараметрыТеста);
-    Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура ДропБокс_СоздатьУдалитьТег() Экспорт
-    
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-    
-    Dropbox_ДобавитьТег(ПараметрыТеста);
-    Dropbox_ПолчитьСписокТегов(ПараметрыТеста);
-    Dropbox_УдалитьТег(ПараметрыТеста);
-    
-КонецПроцедуры
-
-Процедура ДропБокс_ПолучитьАккаунт() Экспорт
-  
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-    
-    Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыТеста);
-    Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыТеста);
-      
-КонецПроцедуры
-
-Процедура ДропБокс_РаботаСДоступами() Экспорт
-    
-    ПараметрыТеста = Новый Структура;
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token"    , ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_OtherUser", ПараметрыТеста);
-    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_FileID"   , ПараметрыТеста);
-    
-    Dropbox_ДобавитьПользователейКФайлу(ПараметрыТеста);
-    Dropbox_ОпубликоватьПапку(ПараметрыТеста);
-    Dropbox_ДобавитьПользователейКПапке(ПараметрыТеста);
-    Dropbox_ОтменитьПубликациюПапки(ПараметрыТеста);
-    Dropbox_ОтменитьПубликациюФайла(ПараметрыТеста);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьПараметрыВК() 
-    
-    Параметры   = Новый Структура;
-    НомерГруппы = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_GroupID");
-    
-    Параметры.Вставить("access_token"  , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_Token"));
-    Параметры.Вставить("owner_id"      , "-" + НомерГруппы);
-    Параметры.Вставить("app_id"        , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AppID"));
-    Параметры.Вставить("group_id"      , НомерГруппы);
-    
-    Возврат Параметры;
-    
-КонецФункции
-
-Функция ПолучитьПараметрыТвиттер() 
-    
-    Параметры = Новый Соответствие;
-              
-    Параметры.Вставить("redirect_uri"          , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Redirect"));
-    Параметры.Вставить("client_id"             , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClinetID"));
-    Параметры.Вставить("client_secret"         , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClientSecret"));
-    Параметры.Вставить("access_token"          , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Token"));
-    Параметры.Вставить("refresh_token"         , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Refresh"));
-    Параметры.Вставить("oauth_token"           , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthToken"));
-    Параметры.Вставить("oauth_token_secret"    , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthSecret"));
-    
-    Параметры.Вставить("oauth_consumer_key"    
-        , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerKey"));
-    Параметры.Вставить("oauth_consumer_secret" 
-        , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerSecret"));
-
-    Возврат Параметры;
-    
-КонецФункции
-
-#Область Проверки
-
-Процедура Проверка_Пусто(Знач Результат)   
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
-КонецПроцедуры
-
-Процедура Проверка_ДвоичныеДанные(Знач Результат, Знач Размер = Неопределено)
-    
-    МинимальныйРазмер = 500000;
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); 
-    
-    Если Не Размер = Неопределено Тогда
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Размер); 
-    Иначе
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер() > МинимальныйРазмер).Равно(Истина);
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмИстина(Знач Результат)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
-        
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмИнформацияБота(Знач Результат)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["username"]).Заполнено();
-    
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмМассив(Результат)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив");
-    
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмУстановкаВебхук(Знач Результат)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Webhook was set");
-    
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмУдалениеВебхук(Знач Результат)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Заполнено();
-    
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмСообщение(Знач Результат, Знач Текст)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["text"]).Равно(Текст);
-    	
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмКартинка(Знач Результат, Знач Текст)
-	
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["photo"]).ИмеетТип("Массив");
-        
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмВидео(Знач Результат, Знач Текст)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["video"]["mime_type"]).Равно("video/mp4");
-    	
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмАудио(Знач Результат, Знач Текст)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["audio"]["mime_type"]).Равно("audio/mpeg");
-            
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмДокумент(Знач Результат, Знач Текст)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["document"]).ИмеетТип("Соответствие").Заполнено();  
-      
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмГифка(Знач Результат, Знач Текст)
-
-    Result = "result";
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["caption"]).Равно(Текст);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["document"]).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["animation"]["mime_type"]).Равно("video/mp4");
-            
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмМедиагруппа(Знач Результат)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив");
-            
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмМестоположение(Знач Результат)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["location"]).ИмеетТип("Соответствие").Заполнено();   
-     
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмКонтакт(Знач Результат, Знач Имя)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]["first_name"]).Равно(Имя);
-            
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмОпрос(Знач Результат, Знач Вопрос)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]["question"]).Равно(Вопрос);
-        	
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмПереслать(Знач Результат, Знач IDСообщения)
-	
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["forward_origin"]["message_id"]).Равно(Число(IDСообщения));
-    
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмБан(Знач Результат)
-	
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Bad Request: can't remove chat owner");
-    	
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмПриглашение(Знач Результат, Знач Заголовок, Знач UnixИстечение)
-
-    Result        = "result";
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["member_limit"]).Равно(200);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["name"]).Равно(Заголовок);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["expire_date"]).Равно(Число(UnixИстечение));
-    	
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмЧисло(Знач Результат)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Число");
-    	
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмСозданиеТемы(Знач Результат, Знач Имя, Иконка)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["name"]).Равно(Имя);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["icon_custom_emoji_id"]).Равно(Иконка);
-    	
-КонецПроцедуры
-
-Процедура Проверка_ВКПост(Знач Результат)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["post_id"]).ИмеетТип("Число").Заполнено();
-        
-КонецПроцедуры
-
-Процедура Проверка_ВКИстина(Знач Результат)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Равно(1);
-    
-КонецПроцедуры
-
-Процедура Проверка_ВКАльбом(Знач Результат, Знач Описание)
-
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["description"]).Равно(Описание);
-        
-КонецПроцедуры
-
-Процедура Проверка_ВККартинкаАльбома(Знач Результат, Знач ОписаниеКартинки, Знач ИДАльбома)
-
-    Response    = "response";
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["text"]).Равно(ОписаниеКартинки);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["album_id"]).Равно(ИДАльбома);
-            
-КонецПроцедуры
-
-Процедура Проверка_ВКИстория(Знач Результат)
-  
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["count"]).ИмеетТип("Число").Равно(1);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["items"]).ИмеетТип("Массив").Заполнено();
-      
-КонецПроцедуры
-
-Процедура Проверка_ВКОбсуждение(Знач Результат)
- 
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();   
-    
-КонецПроцедуры
-
-Процедура Проверка_ГКОбъект(Знач Результат, Знач Наименование, Знач Описание)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["summary"]).Равно(Наименование);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип("Строка").Заполнено();
-    
-КонецПроцедуры
-
-Процедура Проверка_ТвиттерТекст(Знач Результат, Знач Текст)
-    
-    ТекстОтвета = Результат["data"]["text"];
-    ТекстОтвета = Лев(ТекстОтвета, СтрДлина(Текст));
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ТекстОтвета).Равно(Текст);
-
-КонецПроцедуры
-
-Процедура Проверка_ВайберОк(Знач Результат)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Равно("ok");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status"]).Равно(0);
-
-КонецПроцедуры
-
-Процедура Проверка_НоушнОбъект(Знач Результат, Знач Вид = "page")
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["object"]).Равно(Вид);
-    
-КонецПроцедуры
-
-Процедура Проверка_СлакОк(Знач Результат)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксФайл(Знач Результат, Знач Путь)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path_display"]).Равно(Путь);
-    
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксМетаданные(Знач Результат, Знач Путь)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["metadata"]["path_display"]).Равно(Путь);
-    
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксМассив(Знач Результат, Знач Количество = Неопределено)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"]).ИмеетТип("Массив");
-    
-    Если Не Количество = Неопределено Тогда
-        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"].Количество()).Равно(Количество);
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксРабота(Знач Результат)
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["async_job_id"]).Заполнено();
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксСтатус(Знач Результат)
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[".tag"]).Равно("complete");
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксТеги(Знач Результат, Знач Количество)
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"]).ИмеетТип("Массив");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"].Количество()).Равно(Количество);
-    
-КонецПроцедуры
-
-Процедура Проверка_ДропбоксАккаунт(Знач Результат)
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["account_id"]).Заполнено();
-КонецПроцедуры
-
-Процедура Проверка_ДропбоксПространство(Знач Результат)
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["used"]).Заполнено();
-КонецПроцедуры
-
-Процедура Проверка_ДропбоксУчастник(Знач Результат, Знач Почта, Знач ТолькоПросмотр)
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["result"][".tag"]).Равно("success");
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["member"]["email"]).Равно(Почта);
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(
-        Результат[0]["result"]["success"][".tag"]).Равно(?(ТолькоПросмотр, "viewer", "editor"));
-КонецПроцедуры
-
-Процедура Проверка_ДропбоксПубличнаяПапка(Знач Результат)
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["shared_folder_id"]).Заполнено();
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область АтомарныеТесты
-
-#Область Telegram
-
-Процедура Telegram_ПолучитьИнформациюБота(ПараметрыФункции)
-
-    Токен       = ПараметрыФункции["Telegram_Token"];
-    Результат   = OPI_Telegram.ПолучитьИнформациюБота(Токен);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram");
-        
-    Проверка_ТелеграмИнформацияБота(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ПолучитьОбновления(ПараметрыФункции)
-	
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Результат   = OPI_Telegram.ПолучитьОбновления(Токен);
-
-	// END
-	
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram");
-    
-    Проверка_ТелеграмМассив(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Telegram_УстановитьWebhook(ПараметрыФункции)
-    
-    Токен       = ПараметрыФункции["Telegram_Token"];
-    URL         = ПараметрыФункции["Telegram_URL"];
-    
-    Результат   = OPI_Telegram.УстановитьWebhook(Токен, URL);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram");
-      
-    Проверка_ТелеграмУстановкаВебхук(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Telegram_УдалитьWebhook(ПараметрыФункции)
-	
-	Токен     = ПараметрыФункции["Telegram_Token"];
-	Результат = OPI_Telegram.УдалитьWebhook(Токен);
-	
-	// END
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram");
-      
-    Проверка_ТелеграмУдалениеВебхук(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции)
-	
-	Токен    = ПараметрыФункции["Telegram_Token"];
-	IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-	IDКанала = ПараметрыФункции["Telegram_ChannelID"];    
-	Текст    = ПараметрыФункции["String"];
-	
-    Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram"); 
-    
-    Проверка_ТелеграмСообщение(Результат, Текст); // SKIP
-    
-    Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (канал)"); 
-    
-    Проверка_ТелеграмСообщение(Результат, Текст);
-    
-    IDСообщения = OPI_Инструменты.ЧислоВСтроку(Результат["result"]["message_id"]);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_ChannelMessageID", IDСообщения);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьКартинку(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
-    Текст    = ПараметрыФункции["String"];
-    Картинка = ПараметрыФункции["Picture"]; 
-    
-    КартинкаПуть = ПолучитьИмяВременногоФайла("png");
-    КопироватьФайл(Картинка, КартинкаПуть);
-    
-    КартинкаДД   = Новый ДвоичныеДанные(КартинкаПуть);
-    
-    Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, Текст, Картинка);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram");
-    
-    Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
-  
-    Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)");
-    
-    Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
-      
-    Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД);
-    
-    // END 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (ДД)");
-    
-    Проверка_ТелеграмКартинка(Результат, Текст);
-    
-    УдалитьФайлы(КартинкаПуть);
-    
-    IDФайла = Результат["result"]["photo"][0]["file_id"];
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
-    
-    ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьВидео(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
-    Текст    = ПараметрыФункции["String"];
-    Видео    = ПараметрыФункции["Video"];
-    
-    ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
-    КопироватьФайл(Видео, ВидеоПуть);
-    
-    ВидеоДД   = Новый ДвоичныеДанные(ВидеоПуть);
-    
-    Результат = OPI_Telegram.ОтправитьВидео(Токен, IDЧата, Текст, Видео);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram");
-    
-    Проверка_ТелеграмВидео(Результат, Текст); // SKIP
-  
-    Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)");
-    
-    Проверка_ТелеграмВидео(Результат, Текст); // SKIP
-      
-    Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД);
-    
-    // END 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (ДД)");
-    
-    Проверка_ТелеграмВидео(Результат, Текст);
-    
-    УдалитьФайлы(ВидеоПуть);
-    
-    IDФайла = Результат["result"]["video"]["file_id"];
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
-    
-    ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьАудио(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
-    Текст    = ПараметрыФункции["String"];
-    Аудио    = ПараметрыФункции["Audio"];
-    
-    АудиоПуть = ПолучитьИмяВременногоФайла("mp3");
-    КопироватьФайл(Аудио, АудиоПуть);
-    
-    АудиоДД   = Новый ДвоичныеДанные(АудиоПуть);
-    
-    Результат = OPI_Telegram.ОтправитьАудио(Токен, IDЧата, Текст, Аудио);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram");
-    
-    Проверка_ТелеграмАудио(Результат, Текст); // SKIP
-  
-    Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)");
-    
-    Проверка_ТелеграмАудио(Результат, Текст); // SKIP
-      
-    Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД);
-    
-    // END 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (ДД)");
-    
-    Проверка_ТелеграмАудио(Результат, Текст);
-    
-    УдалитьФайлы(АудиоПуть);
-    
-    IDФайла = Результат["result"]["audio"]["file_id"];
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
-    
-    ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьДокумент(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
-    Текст    = ПараметрыФункции["String"];
-    Документ = ПараметрыФункции["Document"];
-    
-    ДокументПуть = ПолучитьИмяВременногоФайла("docx");
-    КопироватьФайл(Документ, ДокументПуть);
-    
-    ДокументДД   = Новый ДвоичныеДанные(ДокументПуть);
-    
-    Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDЧата, Текст, Документ);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram");
-    
-    Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
-  
-    Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)");
-    
-    Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
-      
-    Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД);
-    
-    // END 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)");
-    
-    Проверка_ТелеграмДокумент(Результат, Текст);
-    
-    УдалитьФайлы(ДокументПуть);
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьГифку(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
-    Текст    = ПараметрыФункции["String"];
-    Гифка    = ПараметрыФункции["GIF"];
-    
-    ГифкаПуть = ПолучитьИмяВременногоФайла("gif");
-    КопироватьФайл(Гифка, ГифкаПуть);
-    
-    ГифкаДД   = Новый ДвоичныеДанные(ГифкаПуть);
-    
-    Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram");
-    
-    Проверка_ТелеграмГифка(Результат, Текст); // SKIP
-  
-    Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)");
-    
-    Проверка_ТелеграмГифка(Результат, Текст); // SKIP
-      
-    Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД);
-    
-    // END 
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)");
-    
-    Проверка_ТелеграмГифка(Результат, Текст);
-    
-    УдалитьФайлы(ГифкаПуть);
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    Текст    = ПараметрыФункции["String"];
-    Картинка = ПараметрыФункции["Picture"];
-    Видео    = ПараметрыФункции["Video"];
- 
-    КартинкаПуть = ПолучитьИмяВременногоФайла("png");
-    КопироватьФайл(Картинка, КартинкаПуть);
-           
-    ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
-    КопироватьФайл(Видео, ВидеоПуть);
-    
-    ВидеоДД   = Новый ДвоичныеДанные(ВидеоПуть);
-    
-    Медиагруппа    = Новый Соответствие;
-    Медиагруппа.Вставить(КартинкаПуть, "photo");
-    Медиагруппа.Вставить(ВидеоДД     , "video");
-    
-    Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram");
-    
-    Проверка_ТелеграмМедиагруппа(Результат); 
-   
-    УдалитьФайлы(ВидеоПуть);
-    УдалитьФайлы(КартинкаПуть);
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции)
-    
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала = ПараметрыФункции["Telegram_ChannelID"];    
-    Ширина   = ПараметрыФункции["Lat"];
-    Долгота  = ПараметрыФункции["Long"];
-    
-    Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram"); 
-    
-    Проверка_ТелеграмМестоположение(Результат); // SKIP
-    
-    Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)"); 
-    
-    Проверка_ТелеграмМестоположение(Результат);
-
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала = ПараметрыФункции["Telegram_ChannelID"];    
-    Имя      = ПараметрыФункции["Name"];
-    Фамилия  = ПараметрыФункции["Surname"];
-    Телефон  = ПараметрыФункции["Phone"];
-    
-    Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата  , Имя, Фамилия, Телефон);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram"); 
-    
-    Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP
-    OPI_Инструменты.Пауза(20);                // SKIP
-    
-    Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)"); 
-    
-    Проверка_ТелеграмКонтакт(Результат, Имя);
-
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьОпрос(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Telegram_Token"];
-    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала = ПараметрыФункции["Telegram_ChannelID"]; 
-    Вопрос   = "Какой ваш любимый цвет?";
-    
-    МассивОтветов     = Новый Массив;
-    МассивОтветов.Добавить("Красный");
-    МассивОтветов.Добавить("Желтый");
-    МассивОтветов.Добавить("Зеленый");
-    МассивОтветов.Добавить("Синий");
-    
-    Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата  , Вопрос, МассивОтветов, Ложь);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram");
-                
-    Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
-    
-    Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)");
-                
-    Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
-    
-    // END
-    
-    СтрочныйМассив    = "['Красный', 'Желтый','Зеленый' ,'Синий']";
-    
-    Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)");
-                
-    Проверка_ТелеграмОпрос(Результат, Вопрос);
-
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_СкачатьФайл(ПараметрыФункции)
-	
-	IDФайла = ПараметрыФункции["Telegram_FileID"];
-	Токен   = ПараметрыФункции["Telegram_Token"];
-
-    Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные");
-    	
-КонецПроцедуры
-
-Процедура Telegram_ПереслатьСообщение(ПараметрыФункции)
-
-    Токен       = ПараметрыФункции["Telegram_Token"];
-    IDЧата      = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала    = ПараметрыФункции["Telegram_ChannelID"];
-    IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
-    
-    Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата);
-    
-    // END
-
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram");
-        
-	Проверка_ТелеграмПереслать(Результат, IDСообщения);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_Бан(ПараметрыФункции)
-	
-	Токен          = ПараметрыФункции["Telegram_Token"];
-    IDПользователя = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала       = ПараметрыФункции["Telegram_ChannelID"];
-    
-	Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя);
-
-	// END
-	
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram");
-    
-	Проверка_ТелеграмБан(Результат);
-	OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Telegram_Разбан(ПараметрыФункции)
-	
-    Токен          = ПараметрыФункции["Telegram_Token"];
-    IDПользователя = ПараметрыФункции["Telegram_ChatID"];
-    IDКанала       = ПараметрыФункции["Telegram_ChannelID"];
-    
-	Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя);
-
-	// END
-	
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram");
-    
-	Проверка_ТелеграмБан(Результат);
-	OPI_Инструменты.Пауза(5);
-	
-КонецПроцедуры
-
-Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции)
-
-    Токен         = ПараметрыФункции["Telegram_Token"];
-    IDКанала      = ПараметрыФункции["Telegram_ChannelID"];    
-    Сутки         = 86400;   
-    ТекущаяДата   = OPI_Инструменты.ПолучитьТекущуюДату();
-
-    Заголовок     = "Ссылка " + Строка(ТекущаяДата); 
-    Истечение     = ТекущаяДата + Сутки;
-    UnixИстечение = OPI_Инструменты.UNIXTime(Истечение);
-    
-    Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram");
-
-	Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции)
-
-    Токен       = ПараметрыФункции["Telegram_Token"];
-    IDКанала    = ПараметрыФункции["Telegram_ChannelID"];
-    IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
-    
-    Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения);
-
-	// END
-	
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram");
-	
-	Проверка_ТелеграмИстина(Результат);
-        
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции)
-
-    Токен       = ПараметрыФункции["Telegram_Token"];
-    IDКанала    = ПараметрыФункции["Telegram_ChannelID"];
-    IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
-    
-    Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения);
-
-	// END
-	
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram");
-	
-	Проверка_ТелеграмИстина(Результат);
-        
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции)
-	
-    Токен       = ПараметрыФункции["Telegram_Token"];
-    IDКанала    = ПараметрыФункции["Telegram_ChannelID"];
-    
-    Результат  = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram");
-    
-    Проверка_ТелеграмЧисло(Результат);
-        
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции)
-	
-	Токен       = ПараметрыФункции["Telegram_Token"];
-	Результат   = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен);
-	
-	// END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции)
-	
-	Токен  = ПараметрыФункции["Telegram_Token"];
-    Чат    = ПараметрыФункции["Telegram_ForumID"];
-    Иконка = "5357419403325481346";
-    Имя    = "Тестовая тема " + Строка(Новый УникальныйИдентификатор);
-    
-	Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка);
-	
-	// END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram");
-    
-    Тема = Результат["result"]["message_thread_id"];
-    
-    ПараметрыФункции.Вставить("Telegram_TopicID", Тема);
-    OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]);
-   
-	Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка);
-	
-	ЧатТема   = Чат + "*" + Тема;
-	Текст     = ПараметрыФункции["String"];
-    Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)");
-    
-    Проверка_ТелеграмСообщение(Результат, Текст);
-	
-КонецПроцедуры
-
-Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции)
-
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Чат         = ПараметрыФункции["Telegram_ForumID"];
-    Тема        = ПараметрыФункции["Telegram_TopicID"];
-    НовоеИмя    = "Новый тестовый заголовок";
-    НовяИконка  = "5310132165583840589";
-
-    Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram");
-        
-    Проверка_ТелеграмИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции)
-
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Чат         = ПараметрыФункции["Telegram_ForumID"];
-    Тема        = ПараметрыФункции["Telegram_TopicID"];
-
-    OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP
-    
-	Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат);       // Закрывает главную тему
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)");
-    
-    Проверка_ТелеграмИстина(Результат); // SKIP
-    
-    Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram");
-    
-    Проверка_ТелеграмИстина(Результат);
-    
-    OPI_Инструменты.Пауза(25);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции)
-
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Чат         = ПараметрыФункции["Telegram_ForumID"];
-    Тема        = ПараметрыФункции["Telegram_TopicID"];
-
-	Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат);       // Открывает главную тему
-	
-	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)");
-    
-    Проверка_ТелеграмИстина(Результат); // SKIP
-    
-    Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram");
-    
-    Проверка_ТелеграмИстина(Результат);
-    
-    OPI_Инструменты.Пауза(25);
-    	
-КонецПроцедуры
-
-Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции)
-
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Чат         = ПараметрыФункции["Telegram_ForumID"];
-    Тема        = ПараметрыФункции["Telegram_TopicID"];
-    
-    Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема); 
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram");
-    
-    Проверка_ТелеграмИстина(Результат);
-    
-    OPI_Инструменты.Пауза(25);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции)
-
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Чат         = ПараметрыФункции["Telegram_ForumID"];
-    Тема        = ПараметрыФункции["Telegram_TopicID"];
-    
-    Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)");
-    
-    Проверка_ТелеграмИстина(Результат); // SKIP
-    
-    Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram");
-    
-    Проверка_ТелеграмИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции)
-
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Чат         = ПараметрыФункции["Telegram_ForumID"];
-    
-    Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram");
-    
-    Проверка_ТелеграмИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции)
-
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Чат         = ПараметрыФункции["Telegram_ForumID"];
-    
-    Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram");
-    
-    Проверка_ТелеграмИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции)
-
-	Заголовок   = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор);
-	Токен       = ПараметрыФункции["Telegram_Token"];
-    Чат         = ПараметрыФункции["Telegram_ForumID"];    
-	
-    Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram");
-    
-    Проверка_ТелеграмИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    	
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область VK
-
-Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции)
-
-    Приложение = ПараметрыФункции["VK_AppID"];
-    Результат  = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK");
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура VK_СоздатьПост(ПараметрыФункции)
-    
-    Параметры = ПолучитьПараметрыВК();
-    Текст     = "Пост из автотеста";
-    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
-    
-    Картинка  = ПараметрыФункции["Picture"];  // URL, Путь или Двоичные данные
-    Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные
-    
-    ИВФ = ПолучитьИмяВременногоФайла("png");   
-    КопироватьФайл(Картинка2, ИВФ);
-    
-    МассивКартинок = Новый Массив;
-    МассивКартинок.Добавить(Картинка);
-    МассивКартинок.Добавить(ИВФ);
-  
-    Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK");
-
-    Проверка_ВКПост(Результат);                         // SKIP
-    ИДПоста   = Результат["response"]["post_id"];       // SKIP
-    Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP
-    
-    Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь  ,    , Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)");
-
-    Проверка_ВКПост(Результат); 
-    
-    ИДПоста   = Результат["response"]["post_id"];       
-    Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); 
-    
-    OPI_Инструменты.Пауза(5);   
-    
-    Результат = OPI_VK.СоздатьПост(Текст, ИВФ     , Истина, URL, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)");
-
-    Проверка_ВКПост(Результат);                   
-    
-    ИДПоста = Результат["response"]["post_id"];
-    OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]);
-    
-    УдалитьФайлы(ИВФ);
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура VK_УдалитьПост(ПараметрыФункции)
-    
-    Параметры = ПолучитьПараметрыВК();
-    ИДПоста   = ПараметрыФункции["VK_PostID"];
-    
-    Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
-
-    // END
-
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПост", "VK");
-            
-    Проверка_ВКИстина(Результат);
-    
-КонецПроцедуры
-
-Процедура VK_СоздатьСоставнойПост(ПараметрыФункции)
-
-    Параметры = ПолучитьПараметрыВК();
-    Текст     = "Пост из автотеста";
-    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
-    
-    Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
-    Видео    = ПараметрыФункции["Video"];   // URL, Путь или Двоичные данные
-    
-    ИВФ = ПолучитьИмяВременногоФайла("png");   
-    КопироватьФайл(Картинка, ИВФ);
-    
-    ЗагрузкаКартинки = OPI_VK.ЗагрузитьФотоНаСервер(ИВФ, Параметры)["response"][0];
-    ЗагрузкаВидео    = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, "Новое видео", , , Параметры);
-    
-    ВладелецКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["owner_id"]);
-    ВладелецВидео    = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["owner_id"]);
-    
-    IDКартинки       = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["id"]);
-    IDВидео          = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["video_id"]);
-    
-    МассивВложений = Новый Массив;
-    МассивВложений.Добавить("photo" + ВладелецКартинки + "_" + IDКартинки);
-    МассивВложений.Добавить("video" + ВладелецВидео + "_" + IDВидео);
-    
-    Результат = OPI_VK.СоздатьСоставнойПост(Текст, МассивВложений, Ложь, URL, Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK");
-    
-    Проверка_ВКПост(Результат);
-    УдалитьФайлы(ИВФ);    
-        
-    OPI_Инструменты.Пауза(5);
-     
-КонецПроцедуры
-
-Процедура VK_СоздатьОпрос()
-
-    Параметры = ПолучитьПараметрыВК();
-    Вопрос    = "Какой ваш любимый цвет?";
-    
-    МассивВариантов = Новый Массив;
-    МассивВариантов.Добавить("Красный");
-    МассивВариантов.Добавить("Желтый");
-    МассивВариантов.Добавить("Зеленый");
-    
-    Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK");
-    
-    Проверка_ВКПост(Результат);
-        
-    ИДПоста  = Результат["response"]["post_id"];
-    OPI_VK.УдалитьПост(ИДПоста, Параметры);
-    
-    OPI_Инструменты.Пауза(10);
-        
-КонецПроцедуры
-
-Процедура VK_СоздатьАльбом(ПараметрыФункции)
-    
-    Параметры        = ПолучитьПараметрыВК();
-    Имя              = "Альбом из автотеста";
-    Описание         = "Новый альбом из автотеста";
-      
-    Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK");
-    
-    Проверка_ВКАльбом(Результат, Описание);
-        
-    ИДАльбома  = Результат["response"]["id"];
-    ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома);
-    
-КонецПроцедуры
-
-Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции)
-    
-    Параметры        = ПолучитьПараметрыВК();
-    ОписаниеКартинки = "Картинка автотест";
-    ИДАльбома        = ПараметрыФункции["VK_AlbumID"];
-    
-    Картинка  = ПараметрыФункции["Picture"];       // URL, Путь к файлу или Двоичные данные
-    ИВФ       = ПолучитьИмяВременногоФайла("png");
-    КопироватьФайл(Картинка, ИВФ);
-    
-    Картинка  = Новый ДвоичныеДанные(ИВФ);
-    
-    Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK");
-    
-    Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
-    
-    ИДКартинки  = Результат["response"][0]["id"];                       // SKIP
-    Результат    = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);       // SKIP
-            
-    Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры);
-    
-    // END
-   
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)");
-    
-    Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
-    
-    ИДКартинки  = Результат["response"][0]["id"];
-    ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки);
-    
-    УдалитьФайлы(ИВФ);
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура VK_УдалитьКартинку(ПараметрыФункции)
-    
-    Параметры  = ПолучитьПараметрыВК();
-    ИДКартинки = ПараметрыФункции["VK_PictureID"];
-    
-    Результат  = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK");
-    
-    Проверка_ВКИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура VK_УдалитьАльбом(ПараметрыФункции)
-    
-    Параметры = ПолучитьПараметрыВК();
-    ИДАльбома = ПараметрыФункции["VK_AlbumID"];
-    
-    Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK");
-        
-    Проверка_ВКИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура VK_СоздатьИсторию(ПараметрыФункции)
-
-    Параметры = ПолучитьПараметрыВК();
-    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
-
-    Картинка  = ПараметрыФункции["Picture"];       // URL, Путь к файлу или Двоичные данные
-    ИВФ       = ПолучитьИмяВременногоФайла("png");
-    КопироватьФайл(Картинка, ИВФ);
-    Картинка  = Новый ДвоичныеДанные(ИВФ);
-       
-    Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры);
-
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK");
-    
-    Проверка_ВКИстория(Результат); // SKIP
-        
-    Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)");
-    
-    Проверка_ВКИстория(Результат);
-    
-    УдалитьФайлы(ИВФ);
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура VK_СоздатьОбсуждение(ПараметрыФункции)
-
-    Параметры       = ПолучитьПараметрыВК();
-    Название        = "Обсуждаем: какой цвет лучше?";
-    Сообщение       = "Красный, желтый, синий или какой-то другой?";
-    
-    Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK");
-    
-    Проверка_ВКОбсуждение(Результат);
-    
-    ИДОбсуждения = Результат["response"];
-    ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения);    
-    
-    OPI_Инструменты.Пауза(5);
-        
-КонецПроцедуры
-
-Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции)
-    
-    Параметры    = ПолучитьПараметрыВК();
-    ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
-    Результат    = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK");
-        
-    Проверка_ВКИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура VK_ОткрытьОбсуждение(ПараметрыФункции)
-    
-    Параметры    = ПолучитьПараметрыВК();
-    ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
-    Результат    = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK");
-        
-    Проверка_ВКИстина(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура VK_НаписатьВОбсуждение(ПараметрыФункции)
-    
-    Параметры    = ПолучитьПараметрыВК();
-    ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
-    Сообщение    = "Мне больше нравится желтый";
-    
-    Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK");
-    
-    Проверка_ВКОбсуждение(Результат);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Dropbox
-
-Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции)
-
-    КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
-    Результат      = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox");
-        
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка");
-    
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьТокен(ПараметрыФункции)
-    
-    КлючПриложения   = ПараметрыФункции["Dropbox_Appkey"];
-    СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
-    Код              = ПараметрыФункции["Dropbox_Code"];
-
-    Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен");
-    
-    Токен  = Результат["access_token"];
-    Рефреш = Результат["refresh_token"];
-   
-    Если ЗначениеЗаполнено(Токен) Тогда
-        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
-    КонецЕсли;
-   
-    Если ЗначениеЗаполнено(Рефреш) Тогда
-        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш);
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Процедура Dropbox_ОбновитьТокен(ПараметрыФункции)
-
-    КлючПриложения   = ПараметрыФункции["Dropbox_Appkey"];
-    СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
-    РефрешТокен      = ПараметрыФункции["Dropbox_Refresh"];
-    
-    Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен");
-    
-    Токен = Результат["access_token"];
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено();
-
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
-        
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции)
-   
-    Путь      = "/New/pic.png";  
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-     
-    Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox");
-
-    Проверка_ДропБоксФайл(Результат, Путь);
-    
-    OPI_Инструменты.Пауза(5); 
-    
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьПревью(ПараметрыФункции)
-   
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/New/mydoc.docx"; 
-    
-    Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox");
-        
-    Проверка_ДвоичныеДанные(Результат, 190834);
-        
-    OPI_Инструменты.Пауза(5); 
-     
-КонецПроцедуры
-
-Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции)
-
-    Путь      = "/New/pic.png";  
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Картинка  = ПараметрыФункции["Picture"];
-    
-    КартинкаПуть = ПолучитьИмяВременногоФайла("png");
-    КопироватьФайл(Картинка, КартинкаПуть);
-    
-    Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox");
-        
-    Проверка_ДропБоксФайл(Результат, Путь);
-    УдалитьФайлы(КартинкаПуть);
-    
-    OPI_Инструменты.Пауза(5); 
-     
-КонецПроцедуры
-
-Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции)
-   
-    Путь  = "/New/url_doc.docx";  
-    Токен = ПараметрыФункции["Dropbox_Token"];
-    URL   = ПараметрыФункции["Document"];
-    
-    Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайлПоURL", "Dropbox");
-        
-    Проверка_ДропБоксРабота(Результат);
-   
-    Работа = Результат["async_job_id"];
-   
-    ПараметрыФункции.Вставить("Dropbox_Job", Работа);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Job", Работа);
-    
-    OPI_Инструменты.Пауза(5); 
-     
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыФункции)
-
-    Токен    = ПараметрыФункции["Dropbox_Token"];
-    ИДРаботы = ПараметрыФункции["Dropbox_Job"];
-    Статус   = "in_progress";    
-    
-    Пока Статус = "in_progress" Цикл 
-        
-        Результат = OPI_Dropbox.ПолучитьСтатусЗагрузкиПоURL(Токен, ИДРаботы);
-        Статус    = Результат[".tag"];
-        
-        OPI_Инструменты.Пауза(5);
-        
-        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox");
-        
-    КонецЦикла;
-    
-    // END
-    
-    Проверка_ДропБоксСтатус(Результат);
-    
-    Путь      = "/New/url_doc.docx";
-    Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
-    
-    Проверка_ДропБоксМетаданные(Результат, Путь);
-    OPI_Инструменты.Пауза(5); 
-        
-КонецПроцедуры
-
-Процедура Dropbox_УдалитьОбъект(ПараметрыФункции)
- 
-    Путь      = "/New/pic.png";  
-    Токен     = ПараметрыФункции["Dropbox_Token"];  
-    
-    Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox");
-
-    Проверка_ДропБоксМетаданные(Результат, Путь);
-    
-    OPI_Инструменты.Пауза(5); 
-     
-КонецПроцедуры
-
-Процедура Dropbox_КопироватьОбъект(ПараметрыФункции)
-    
-    Оригинал  = "/New/pic.png";
-    Копия     = "/New/pic_copy.png";  
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    
-    Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox");
-        
-    Проверка_ДропБоксМетаданные(Результат, Копия);
-    
-    Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия);
-    Проверка_ДропБоксМетаданные(Результат, Копия);
-        
-    OPI_Инструменты.Пауза(5); 
-    
-КонецПроцедуры
-
-Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции)
-    
-    ОригиналныйПуть  = "/New/pic.png";
-    ЦелевойПуть      = "/pic.png";  
-    Токен            = ПараметрыФункции["Dropbox_Token"];
-    
-    Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox");
-        
-    Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть);
-    
-    Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть);
-    Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть);
-        
-    OPI_Инструменты.Пауза(5); 
-    
-КонецПроцедуры
-
-Процедура Dropbox_СоздатьПапку(ПараметрыФункции)
-    
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/Новый каталог";
-    
-    Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox");
-        
-    Проверка_ДропБоксМетаданные(Результат, Путь);
-    
-    Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
-    Проверка_ДропБоксМетаданные(Результат, Путь);
-        
-    OPI_Инструменты.Пауза(5); 
-    
-КонецПроцедуры
-
-Процедура Dropbox_СкачатьФайл(ПараметрыФункции)
-
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/New/pic.png"; 
-    
-    Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox");
-        
-    Проверка_ДвоичныеДанные(Результат, 2114023);
-        
-    OPI_Инструменты.Пауза(5); 
-        
-КонецПроцедуры
-
-Процедура Dropbox_СкачатьПапку(ПараметрыФункции)
-    
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/New";
-    
-    Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox");
-        
-    Проверка_ДвоичныеДанные(Результат);
-        
-    OPI_Инструменты.Пауза(5); 
-    
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции)
- 
-    Путь      = "/New";  
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-     
-    Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox");
-
-    Проверка_ДропБоксМассив(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры 
-
-Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции)
-
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/New/pic.png"; 
-    
-    Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox");
-        
-   Проверка_ДропБоксМассив(Результат, 1);
-   
-   Ревизия = Результат["entries"][0]["rev"];
-   
-   ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия);
-   OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия);
-        
-   OPI_Инструменты.Пауза(5); 
-        
-КонецПроцедуры
-
-Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции)
-   
-    Версия    = ПараметрыФункции["Dropbox_FileRevision"];
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/New/pic.png";  
-    
-    Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox");
-    
-    Проверка_ДропБоксФайл(Результат, Путь);
-    
-    OPI_Инструменты.Пауза(5);  
-    
-КонецПроцедуры
-
-Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции)
-
-    Токен = ПараметрыФункции["Dropbox_Token"];
-    
-    МассивПутей = Новый Массив;
-    МассивПутей.Добавить("/New/Dogs.mp3");
-    МассивПутей.Добавить("/New/mydoc.docx");  
-    
-    Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox");
-    
-    Проверка_ДропБоксТеги(Результат, МассивПутей.Количество());
-    
-    Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx");
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)");
-    
-    Проверка_ДропБоксТеги(Результат, 1);
-    
-    ЕстьТег = Ложь;
-    
-    Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл
-        Если Тег["tag_text"] = "важное" Тогда
-            ЕстьТег = Истина;    
-        КонецЕсли;
-    КонецЦикла;
-    
-    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина);
-    
-    OPI_Инструменты.Пауза(5);  
-        
-КонецПроцедуры
-
-Процедура Dropbox_ДобавитьТег(ПараметрыФункции)
-    
-    Тег       = "Важное";
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/New/mydoc.docx";  
-    
-    Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox");
-    
-    Проверка_Пусто(Результат);
-    
-    OPI_Инструменты.Пауза(5);  
-    
-КонецПроцедуры
-
-Процедура Dropbox_УдалитьТег(ПараметрыФункции)
-    
-    Тег       = "Важное";
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/New/mydoc.docx";  
-    
-    Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox");
-    
-    Проверка_Пусто(Результат);
-    
-    OPI_Инструменты.Пауза(5);  
-    
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции)
-    
-    Токен = ПараметрыФункции["Dropbox_Token"];
-    
-    Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox");
-    
-    Проверка_ДропбоксАккаунт(Результат);
-    
-    Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]);
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)");
-    
-    Проверка_ДропбоксАккаунт(Результат);
-    
-    OPI_Инструменты.Пауза(5);
-    
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции)
-  
-    Токен = ПараметрыФункции["Dropbox_Token"];
-    
-    Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox");
-    
-    Проверка_ДропбоксПространство(Результат);
-      
-КонецПроцедуры
-
-Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции)
-    
-    Токен = ПараметрыФункции["Dropbox_Token"];
-    Почта = ПараметрыФункции["Dropbox_OtherUser"];
-    Файл  = ПараметрыФункции["Dropbox_FileID"];
-    
-    Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь);
-    
-    // END
-        
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
-    
-    Проверка_ДропбоксУчастник(Результат, Почта, Ложь);
-    
-    Почты = Новый Массив;
-    Почты.Добавить(Почта);
-    
-    Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина);
-    
-    Проверка_ДропбоксУчастник(Результат, Почта, Истина);
-    
-КонецПроцедуры
-
-Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции)
-    
-    Токен     = ПараметрыФункции["Dropbox_Token"];
-    Путь      = "/New"; 
-   
-    Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь);
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОпубликоватьПапку", "Dropbox");
-        
-    Проверка_ДропБоксПубличнаяПапка(Результат);
-   
-    IDПапки = Результат["shared_folder_id"];
-   
-    ПараметрыФункции.Вставить("Dropbox_SharedFolder", IDПапки);
-    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_SharedFolder", IDПапки);
-        
-    OPI_Инструменты.Пауза(5); 
-
-КонецПроцедуры
-
-Процедура Dropbox_ОтменитьПубликациюПапки(ПараметрыФункции)
-    
-    Токен  = ПараметрыФункции["Dropbox_Token"];
-    Папка  = ПараметрыФункции["Dropbox_SharedFolder"];
- 
-    Результат     = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка);
-    ТекущийСтатус = "in_progress";
-    IDРаботы      = Результат["async_job_id"];
-    
-    Пока ТекущийСтатус = "in_progress" Цикл
-        Результат     = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы);
-        ТекущийСтатус = Результат[".tag"];
-        OPI_Инструменты.Пауза(3);
-    КонецЦикла;
-    
-    // END
-    
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox");
-    
-   Проверка_ДропБоксСтатус(Результат);
-   
-   OPI_Инструменты.Пауза(5); 
-   
-КонецПроцедуры
-
-Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции)
-    
-    Токен  = ПараметрыФункции["Dropbox_Token"];
-    Почта  = ПараметрыФункции["Dropbox_OtherUser"];
-    Папка  = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id
-    
-    Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь);
-    
-    // END
-        
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
-    
-    Проверка_Пусто(Результат);
-    
-    Почты = Новый Массив;
-    Почты.Добавить(Почта);
-    
-    Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина);
-    
-    Проверка_Пусто(Результат);
-    
-КонецПроцедуры
-
-Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции)
-	
-	Токен = ПараметрыФункции["Dropbox_Token"];
-    Файл  = ПараметрыФункции["Dropbox_FileID"];
-    
-    Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл);
-    
-    // END
-        
-    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox");
-    
-    Проверка_Пусто(Результат);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#КонецОбласти
-
-#КонецОбласти
+// Расположение OS: ./OInt/tests/Modules/internal/OPI_Тесты.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// Набор тестов для YAxUnit
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UsingServiceTag-off
+// BSLLS:UnusedParameters-off
+// BSLLS:DuplicateStringLiteral-off
+
+// @skip-check undefined-variable
+// @skip-check wrong-string-literal-content
+
+// Раскомментировать, если выполняется OneScript
+#Использовать oint
+#Использовать asserts
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+// Для YaxUnit
+
+Процедура ИсполняемыеСценарии() Экспорт
+
+    OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс();
+
+КонецПроцедуры
+
+// Для Asserts
+
+Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
+
+   Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс();
+
+КонецФункции
+
+#Область ЗапускаемыеТесты
+
+#Область Telegram
+
+Процедура Телеграм_ПолучитьИнформациюБота() Экспорт
+ 
+ 	ПараметрыТеста = Новый Структура;
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
+ 	
+	Telegram_ПолучитьИнформациюБота(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура Телеграм_ПолучитьОбновления() Экспорт
+
+ 	ПараметрыТеста = Новый Структура;
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
+ 	
+ 	Telegram_УдалитьWebhook(ПараметрыТеста);
+	Telegram_ПолучитьОбновления(ПараметрыТеста);
+	
+КонецПроцедуры
+
+Процедура Телеграм_УстановитьWebhook() Экспорт
+
+ 	ПараметрыТеста = Новый Структура;
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_URL"  , ПараметрыТеста);
+
+	Telegram_УстановитьWebhook(ПараметрыТеста);
+	Telegram_УдалитьWebhook(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьТекстовоеСообщение() Экспорт
+
+    ПараметрыТеста = Новый Структура;
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
+ 	
+	Telegram_ОтправитьТекстовоеСообщение(ПараметрыТеста);
+        
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьКартинку() Экспорт
+
+    ПараметрыТеста = Новый Структура;
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture"           , ПараметрыТеста);
+ 	
+	Telegram_ОтправитьКартинку(ПараметрыТеста);
+	Telegram_СкачатьФайл(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьВидео() Экспорт
+
+    ПараметрыТеста = Новый Структура;
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
+ 	OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video"             , ПараметрыТеста);
+ 	
+	Telegram_ОтправитьВидео(ПараметрыТеста);
+	Telegram_СкачатьФайл(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьАудио() Экспорт
+
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Audio"             , ПараметрыТеста);
+    
+    Telegram_ОтправитьАудио(ПараметрыТеста);
+    Telegram_СкачатьФайл(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьДокумент() Экспорт
+
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document"          , ПараметрыТеста);
+    
+    Telegram_ОтправитьДокумент(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьГифку() Экспорт
+
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF"               , ПараметрыТеста);
+    
+    Telegram_ОтправитьГифку(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьМедиагруппу() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"            , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture"           , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video"             , ПараметрыТеста);
+    
+    Telegram_ОтправитьМеидагруппу(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьМестоположение() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Long"              , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Lat"               , ПараметрыТеста);
+    
+    Telegram_ОтправитьМестоположение(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьКонтакт() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Name"              , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Surname"           , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Phone"             , ПараметрыТеста);
+
+    Telegram_ОтправитьКонтакт(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьОпрос() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"   , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    
+	Telegram_ОтправитьОпрос(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ПереслатьСообщение() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"           , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"          , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID"       , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста);
+
+	Telegram_ПереслатьСообщение(ПараметрыТеста);
+        
+КонецПроцедуры
+
+Процедура Телеграм_БанРазбан() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"           , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID"          , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID"       , ПараметрыТеста);
+    
+    Telegram_Бан(ПараметрыТеста);
+    Telegram_Разбан(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура Телеграм_СоздатьСсылкуПриглашение() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    
+	Telegram_СоздатьСсылкуПриглашение(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ЗакрепитьОткрепитьСообщение() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"           , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID"       , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста);
+        
+	Telegram_ЗакрепитьСообщение(ПараметрыТеста);
+	Telegram_ОткрепитьСообщение(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ПолучитьЧислоУчастников() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+    
+    Telegram_ПолучитьЧислоУчастников(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
+    
+	Telegram_ПолучитьСписокАватаровФорума(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"  , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture"         , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String"          , ПараметрыТеста);
+    
+	Telegram_СоздатьТемуФорума(ПараметрыТеста);
+	Telegram_ИзменитьТемуФорума(ПараметрыТеста);
+	Telegram_ЗакрытьТемуФорума(ПараметрыТеста);
+	Telegram_ОткрытьТемуФорума(ПараметрыТеста);
+	Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыТеста);
+	Telegram_УдалитьТемуФорума(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_СкрытьПоказатьГлавнуюТему() Экспорт
+ 
+ 	ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"  , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
+
+	Telegram_СкрытьГлавнуюТемуФорума(ПараметрыТеста);
+	Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ИзменитьИмяГлавнойТемы() Экспорт
+ 
+ 	ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token"  , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
+
+	Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыТеста);
+	
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область VK
+
+Процедура ВК_СоздатьСсылкуТокена() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("VK_AppID", ПараметрыТеста);
+
+    VK_СоздатьСсылкуПолученияТокена(ПараметрыТеста);  
+    
+КонецПроцедуры
+
+Процедура ВК_СоздатьУдалитьПост() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2", ПараметрыТеста);
+    
+    VK_СоздатьПост(ПараметрыТеста);
+    VK_УдалитьПост(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьСоставнойПост() Экспорт
+    
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video"   , ПараметрыТеста);
+    
+    VK_СоздатьСоставнойПост(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура ВК_СоздатьОпрос() Экспорт
+ 
+    VK_СоздатьОпрос();
+       
+КонецПроцедуры
+
+Процедура ВК_СохранитьУдалитьКартинку() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+    
+    VK_СоздатьАльбом(ПараметрыТеста);
+    VK_СохранитьКартинкуВАльбом(ПараметрыТеста);
+    VK_УдалитьКартинку(ПараметрыТеста);
+    VK_УдалитьАльбом(ПараметрыТеста);
+           
+КонецПроцедуры
+
+Процедура ВК_СоздатьИсторию() Экспорт
+ 
+    ПараметрыТеста = Новый Соответствие;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+    
+    VK_СоздатьИсторию(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура ВК_МетодыОбсуждений() Экспорт
+ 
+    ПараметрыТеста = Новый Структура;
+    Параметры      = ПолучитьПараметрыВК();
+    
+    VK_СоздатьОбсуждение(ПараметрыТеста);
+    VK_ЗакрытьОбсуждение(ПараметрыТеста);
+    VK_ОткрытьОбсуждение(ПараметрыТеста);
+    VK_НаписатьВОбсуждение(ПараметрыТеста);     
+       
+    OPI_VK.ЗакрытьОбсуждение(ПараметрыТеста["VK_ConvID"], Истина, Параметры);
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура ВК_ЛайкРепостКоммент() Экспорт
+ 
+    Параметры       = ПолучитьПараметрыВК();
+    Текст           = "Пост из автотеста";
+    Сообщение       = "Сообщение из автотеста";
+    ТипСоответствие = Тип("Соответствие");
+    ТипЧисло        = Тип("Число");
+    Response        = "response";
+    
+    Результат = OPI_VK.СоздатьПост(Текст, Новый Массив, , , Параметры);
+    
+    ИДПоста   = Результат[Response]["post_id"];    
+    Результат = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк");
+    
+    OPI_Инструменты.Пауза(5);
+      
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено();
+        
+    ВнешнийПост  = 2571;
+    ВнешняяСтена = -218704372;
+        
+    Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1); 
+        
+    Результат  = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьКомментарий");
+        
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["comment_id"]).ИмеетТип(ТипЧисло).Заполнено();
+   
+    OPI_VK.УдалитьПост(ИДПоста, Параметры);
+    OPI_VK.УдалитьПост(Результат[Response]["post_id"], Параметры);
+    
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСтатистику() Экспорт
+ 
+    ТекущаяДата     = OPI_Инструменты.ПолучитьТекущуюДату();
+    Параметры       = ПолучитьПараметрыВК();
+    Дата0           = НачалоДня(ТекущаяДата);
+    Дата1           = КонецДня(Дата0);
+    ТипСоответствие = Тип("Соответствие");
+     
+    Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено();
+    
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСтатистикуПостов() Экспорт
+ 
+    Параметры    = ПолучитьПараметрыВК();
+    
+    МассивПостов = Новый Массив;
+    МассивПостов.Добавить(214);
+    МассивПостов.Добавить(215);
+    
+    Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры);
+
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2);
+    
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьРекламнуюКампанию() Экспорт
+ 
+    Параметры       = ПолучитьПараметрыВК();
+    ИДКабинета      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID");
+    Наименование    = "Тестовая кампания";
+    ТипСоответствие = Тип("Соответствие");
+    ТипЧисло        = Тип("Число");
+    Response        = "response";
+    UID             = "id";
+        
+    Результат    = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию");
+    
+    Результат    = Результат[Response][0];
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+        
+    ИДКампании  = Результат[UID];
+    ИДКатегории = 126;
+    Лимит       = 150;
+    
+    Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры); 
+    ИДПоста   = Результат[Response]["post_id"]; 
+        
+    Результат   = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании
+        , Лимит
+        , ИДКатегории
+        , ИДПоста
+        , ИДКабинета
+        , Параметры);
+        
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление");
+            
+    Результат   = Результат[Response][0];
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+        
+    ИДОбъявления = Результат[UID];
+    Результат    = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление");
+    
+    Результат    = Результат[Response][0];
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+ 
+    OPI_VK.УдалитьПост(ИДПоста, Параметры);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ВК_ОтправитьСообщение() Экспорт
+ 
+    Параметры    = ПолучитьПараметрыВК();
+    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID");
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken");
+    Текст        = "Сообщение из автотеста";
+    
+    МассивКнопок = Новый Массив;
+    МассивКнопок.Добавить("Кнопка 1");
+    МассивКнопок.Добавить("Кнопка 2"); 
+    
+    Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок);
+    Результат  = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие"); 
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();
+    
+    OPI_Инструменты.Пауза(5);
+  
+КонецПроцедуры
+
+Процедура ВК_ПолучитьКатегорииТоваров() Экспорт
+ 
+    Параметры = ПолучитьПараметрыВК();
+    Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
+        .ИмеетТип("Соответствие")
+        .Заполнено();
+        
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ВК_СоздатьТоварПодборку() Экспорт
+ 
+    Параметры       = ПолучитьПараметрыВК();
+    ТипСоответствие = Тип("Соответствие");
+    ТипЧисло        = Тип("Число");
+    Response        = "response";
+    Картинка        = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+    ИВФ             = ПолучитьИмяВременногоФайла("png");   
+    Картинка.Записать(ИВФ);
+        
+    Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
+        , Картинка
+        , Истина
+        , Ложь
+        , Параметры);  
+        
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено();
+             
+    ИДПодборки = Результат[Response]["market_album_id"];
+    
+    Результат  = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПодборкуТоваров");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Равно(1);
+ 
+    МассивКартинок = Новый Массив;
+    МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"));
+    МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2"));
+    
+    Товар = Новый Соответствие();
+    Товар.Вставить("Имя"                , "Тестовый товар");    
+    Товар.Вставить("Описание"           , "Описание товара");
+    Товар.Вставить("Категория"          , "20173");           
+    Товар.Вставить("Цена"               , 1);                
+    Товар.Вставить("СтараяЦена"         , 15);     
+    Товар.Вставить("ОсновноеФото"       , Картинка);                   
+    Товар.Вставить("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
+    Товар.Вставить("ДополнительныеФото" , МассивКартинок);     
+    Товар.Вставить("ГлавныйВГруппе"     , Истина);                 
+    Товар.Вставить("Ширина"             , 20);     
+    Товар.Вставить("Высота"             , 30);     
+    Товар.Вставить("Глубина"            , 40);     
+    Товар.Вставить("Вес"                , 100);
+    Товар.Вставить("SKU"                , "12345");
+    Товар.Вставить("ДоступныйОстаток"   , "10");
+    
+    Результат = OPI_VK.ДобавитьТовар(Товар, ИДПодборки, Параметры);                // Добавление товара
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено();
+        
+    ИДТовара  = Результат[Response]["market_item_id"];
+    
+    Товар = Новый Соответствие;
+    Товар.Вставить("Имя", "Тестовый товар измененный");
+    
+    Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры);                // Изменение товара
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар");
+    
+    Проверка_ВКИстина(Результат);
+    
+    Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры);    // Добавление в подборку
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено();
+        
+    Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры);    // Удаляет из подборки
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки");
+    
+    OPI_Инструменты.Пауза(5);
+    Проверка_ВКИстина(Результат);
+        
+    Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры);                          // Удаление товара
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар");
+    
+    OPI_Инструменты.Пауза(5);
+    Проверка_ВКИстина(Результат);
+        
+    Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры);                     // Уадление подборки
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку");
+    
+    OPI_Инструменты.Пауза(5);
+    Проверка_ВКИстина(Результат);
+
+    УдалитьФайлы(ИВФ);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ВК_СоздатьТоварСоСвойствами() Экспорт
+ 
+    Параметры       = ПолучитьПараметрыВК();
+    ТипСоответствие = Тип("Соответствие");
+    ТипЧисло        = Тип("Число");
+    MII             = "market_item_id";
+    Response        = "response";
+    Желтый          = "Желтый";
+    Красный         = "Красный";
+    Картинка        = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+    ИВФ             = ПолучитьИмяВременногоФайла("png");   
+    Картинка.Записать(ИВФ);
+    
+    МассивВариантов = Новый Массив;
+    МассивВариантов.Добавить(Желтый);
+    МассивВариантов.Добавить("Синий");
+    МассивВариантов.Добавить(Красный);
+    
+    Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    Свойство  = Результат[Response]["property_id"];
+    Свойство  = OPI_Инструменты.ЧислоВСтроку(Свойство);
+     
+    СоответствиеСвойств = Новый Соответствие;
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено();
+        
+    Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    Проверка_ВКИстина(Результат);
+   
+    Для Каждого Вариант Из МассивВариантов Цикл
+        
+        Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры);
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара");
+        
+        OPI_Инструменты.Пауза(5);
+        
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено();
+            
+        ИДВарианта = Результат[Response]["variant_id"];
+        СоответствиеСвойств.Вставить(Вариант, ИДВарианта);
+        
+        Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор())
+            , Свойство
+            , ИДВарианта
+            , Параметры);
+            
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара");
+        
+    Проверка_ВКИстина(Результат);
+              
+    КонецЦикла;
+  
+    МассивКартинок = Новый Массив;
+    МассивКартинок.Добавить(ИВФ);
+    МассивКартинок.Добавить(Картинка);
+    
+    Товар = Новый Соответствие();
+    Товар.Вставить("Имя"                , "Тестовый товар (" + Желтый + ")");    
+    Товар.Вставить("Описание"           , "Описание товара");
+    Товар.Вставить("Категория"          , "20173");           
+    Товар.Вставить("Цена"               , 1);                
+    Товар.Вставить("СтараяЦена"         , 15);     
+    Товар.Вставить("ОсновноеФото"       , Картинка);                   
+    Товар.Вставить("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
+    Товар.Вставить("ДополнительныеФото" , МассивКартинок);     
+    Товар.Вставить("ГлавныйВГруппе"     , Истина);             
+    Товар.Вставить("НомерГруппы"        , Неопределено);      
+    Товар.Вставить("Ширина"             , 20);     
+    Товар.Вставить("Высота"             , 30);     
+    Товар.Вставить("Глубина"            , 40);     
+    Товар.Вставить("Вес"                , 100);
+    Товар.Вставить("SKU"                , 12345);
+    Товар.Вставить("ДоступныйОстаток"   , "10");
+    Товар.Вставить("ЗначенияСвойств"    , СоответствиеСвойств[Желтый]);
+    
+    Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры);                // Добавление товара  
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    ИДЖелтого = Результат[Response]["market_item_id"];               
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
+        
+    Товар.Вставить("Имя"            , "Тестовый товар (" + Красный + ")");
+    Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]);
+
+    Результат  = OPI_VK.ДобавитьТовар(Товар, , Параметры);                // Добавление товара
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+      
+    OPI_Инструменты.Пауза(5);
+    
+    ИДКрасного = Результат[Response][MII];               
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
+        
+    МассивТоваров = Новый Массив;
+    МассивТоваров.Добавить(ИДЖелтого);
+    МассивТоваров.Добавить(ИДКрасного);
+    
+    Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2);
+        
+    Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено();
+       
+    OPI_VK.УдалитьТовар(ИДЖелтого , Параметры);
+    OPI_VK.УдалитьТовар(ИДКрасного, Параметры);
+    
+    Для Каждого Вариант Из СоответствиеСвойств Цикл
+        
+        Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры);
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара");
+        
+        OPI_Инструменты.Пауза(5);
+        Проверка_ВКИстина(Удаление);
+        
+    КонецЦикла;
+        
+    Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры);
+   
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСвойствоТовара");
+        
+    OPI_Инструменты.Пауза(5);
+    
+    Проверка_ВКИстина(Удаление);
+
+    УдалитьФайлы(ИВФ);
+    
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокТоваров() Экспорт
+ 
+    Параметры = ПолучитьПараметрыВК();
+    Картинка  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"); 
+    
+    МассивКартинок = Новый Массив;
+    МассивКартинок.Добавить(Картинка);
+    
+    Товар = Новый Соответствие();
+    Товар.Вставить("Имя"                , "Тестовый товар 2");    
+    Товар.Вставить("Описание"           , "Описание товара");
+    Товар.Вставить("Категория"          , "20173");           
+    Товар.Вставить("Цена"               , 1);                
+    Товар.Вставить("СтараяЦена"         , 15);     
+    Товар.Вставить("ОсновноеФото"       , Картинка);                   
+    Товар.Вставить("URL"                , "https://github.com/Bayselonarrend/OpenIntegrations");     
+    Товар.Вставить("ДополнительныеФото" , МассивКартинок);     
+    Товар.Вставить("ГлавныйВГруппе"     , Истина);             
+    Товар.Вставить("НомерГруппы"        , Неопределено);      
+    Товар.Вставить("Ширина"             , 20);     
+    Товар.Вставить("Высота"             , 30);     
+    Товар.Вставить("Глубина"            , 40);     
+    Товар.Вставить("Вес"                , 100);
+    Товар.Вставить("SKU"                , 12345);
+    Товар.Вставить("ДоступныйОстаток"   , "10");
+    
+    Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры);
+    ИДТовара  = Результат["response"]["market_item_id"];
+    OPI_Инструменты.Пауза(5);
+    
+    Результат = OPI_VK.ПолучитьСписокТоваров(, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
+        .ИмеетТип("Массив").Заполнено();
+              
+    OPI_VK.УдалитьТовар(ИДТовара, Параметры);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокПодборок() Экспорт
+ 
+    Параметры = ПолучитьПараметрыВК();
+    Картинка  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");    
+    Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
+        , Картинка
+        , Истина
+        , Ложь
+        , Параметры); 
+     
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
+       
+    ИДПодборки = Результат["response"]["market_album_id"];      
+    Результат  = OPI_VK.ПолучитьСписокПодборок(Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
+        .ИмеетТип("Массив").Заполнено();
+        
+    OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); 
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокСвойств() Экспорт
+ 
+    Параметры  = ПолучитьПараметрыВК();
+    Результат  = OPI_VK.ПолучитьСписокСвойств(Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
+        .ИмеетТип("Массив").Заполнено();
+        
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокЗаказов() Экспорт
+ 
+    Параметры  = ПолучитьПараметрыВК();
+    Результат  = OPI_VK.ПолучитьСписокЗаказов(Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат) 
+        .ИмеетТип("Массив").Заполнено();
+        
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ВК_ЗагрузитьВидео() Экспорт
+    
+    Параметры    = ПолучитьПараметрыВК();
+    Видео        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video");
+    Наименование = "Новое видео";
+    Описание     = "Описание видео";
+    
+    Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено();
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область YandexDisk
+
+Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт
+ 
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    Соответствие = "Соответствие";
+    
+    Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ЯДиск_СоздатьПапку() Экспорт
+ 
+   Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+   Путь  = "/" + Строка(Новый УникальныйИдентификатор);
+   
+   Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь);
+   
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
+   
+   OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+   OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("dir");
+   OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
+        
+   OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+  
+   OPI_Инструменты.Пауза(5);
+  
+КонецПроцедуры
+
+Процедура ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект() Экспорт
+ 
+    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    Путь  = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+    URL   = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+
+    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
+    OPI_Инструменты.Пауза(5);
+        
+    Результат = OPI_YandexDisk.ПолучитьОбъект(Токен, Путь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
+
+     OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+     
+     OPI_Инструменты.Пауза(5);
+     
+КонецПроцедуры
+
+Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт
+ 
+    Токен    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    Путь     = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+    Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+    ИВФ      = ПолучитьИмяВременногоФайла("png");
+    Картинка.Записать(ИВФ);
+
+    Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+    
+    Проверка_Пусто(Результат);
+    OPI_Инструменты.Пауза(5);
+    
+    Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
+    
+    Проверка_Пусто(Результат);
+    
+    Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+    
+    Проверка_Пусто(Результат);
+    OPI_Инструменты.Пауза(5);
+    
+    Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь); 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
+    
+    Проверка_Пусто(Результат);   
+
+    УдалитьФайлы(ИВФ);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ЯДиск_СоздатьКопиюОбъекта() Экспорт
+ 
+    Токен           = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    ПутьОригинала   = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+    ПутьКопии       = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+    URL             = "https://raw.githubusercontent.com/Bayselonarrend/"
+        + "OpenIntegrations/main/Media/logo.png";
+
+    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL);
+    OPI_Инструменты.Пауза(5);
+      
+    Результат = OPI_YandexDisk.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКопиюОбъекта");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии);
+
+     OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь);
+     OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь);
+     
+     OPI_Инструменты.Пауза(5);
+     
+КонецПроцедуры
+
+Процедура ЯДиск_ПолучитьСсылкуНаСкачивание() Экспорт
+ 
+    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    Путь  = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+    URL   = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+
+    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
+    OPI_Инструменты.Пауза(5);
+       
+    Результат = OPI_YandexDisk.ПолучитьСсылкуДляСкачивания(Токен, Путь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
+    
+    URL = Результат["href"];
+    
+    Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено();
+
+    OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт
+ 
+    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    Количество = 2;
+    Отступ     = 1;
+    
+    Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image");
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ЯДиск_ПереместитьОбъект() Экспорт
+ 
+    Токен           = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    ПутьОригинала   = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+    ПутьКопии       = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+    URL             = "https://raw.githubusercontent.com/Bayselonarrend/"
+        + "OpenIntegrations/main/Media/logo.png";
+
+    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL);
+    OPI_Инструменты.Пауза(15);
+      
+    Результат = OPI_YandexDisk.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьОбъект");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии);
+
+    OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь);
+    OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь);
+    
+    OPI_Инструменты.Пауза(5);
+     
+КонецПроцедуры
+
+Процедура ЯДиск_ДействияПубличныхОбъектов() Экспорт
+ 
+    PUrl         = "public_url";
+    Соответствие = "Соответствие";
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    Путь         = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+    URL          = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+    
+    OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
+    OPI_Инструменты.Пауза(5);
+    
+    МассивРезультатов = Новый Массив;
+    
+    МассивРезультатов.Добавить(OPI_YandexDisk.ОпубликоватьОбъект(Токен, Путь)); 
+    ПубличныйURL      = МассивРезультатов[0][PUrl];
+    
+    Результат  = OPI_YandexDisk.ПолучитьСсылкуСкачиванияПубличногоОбъекта(Токен, ПубличныйURL);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта");
+              
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
+    
+    Результат   = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/");
+    
+    МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL));
+                
+    МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь));
+    
+    Счетчик = 0;
+    Для Каждого Результат Из МассивРезультатов Цикл
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации");
+            
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено();
+            
+        Если Счетчик = 0 Тогда   
+            OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено();
+        Иначе
+            OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено");
+        КонецЕсли;
+        
+        Счетчик = Счетчик + 1;
+        
+    КонецЦикла;
+     
+    OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+    
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт
+ 
+    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+    Количество = 2;
+    Отступ     = 1;
+    
+    Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Viber
+
+Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт
+ 
+    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");    
+    Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале");
+        
+    Проверка_ВайберОк(Результат);
+
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт
+ 
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); 
+    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+    Результат    = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено();
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт
+ 
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken"); 
+    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+    Результат    = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив");
+    Проверка_ВайберОк(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт
+ 
+    Текст         = "Тестовое сообщение";
+    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
+    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+    
+    МассивКнопок  = Новый Массив;
+    МассивКнопок.Добавить("Кнопка 1");
+    МассивКнопок.Добавить("Кнопка 2");
+    МассивКнопок.Добавить("Кнопка 3");
+    
+    Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок);
+ 
+    Результат  = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    Результат  = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьКартинку() Экспорт
+
+    Текст         = "Тестовое сообщение";
+    Картинка      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
+    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
+    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+     
+    Результат  = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    Результат  = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьФайл() Экспорт
+  
+    Документ      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
+    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
+    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+       
+    Результат  = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx");
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    Результат  = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx");
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьКонтакт() Экспорт
+ 
+    Имя           = "Петр Петров";
+    Телефон       = "+123456789";
+    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
+    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+         
+    Результат  = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    Результат  = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьЛокацию() Экспорт
+
+    Широта        = "48.87373649724122";
+    Долгота       = "2.2954639195323967";
+    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
+    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+         
+    Результат  = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    Результат  = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьСсылку() Экспорт
+
+    URL           = "https://github.com/Bayselonarrend/OpenIntegrations";
+    ТокенКанал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+    ТокенБота     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");   
+    Пользователь  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+    Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+         
+    Результат  = OPI_Viber.ОтправитьСсылку(ТокенБота, URL, Пользователь, Ложь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    Результат  = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+    Проверка_ВайберОк(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleWorkspace
+
+Процедура ГВ_ПолучитьСсылкуАвторизации() Экспорт
+ 
+    ClientID  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");    
+    Результат = OPI_GoogleWorkspace.СформироватьСсылкуПолученияКода(ClientID);
+            
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+        .ИмеетТип("Строка") 
+        .Заполнено();
+        
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Link", Результат);
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура ГВ_ПолучитьТокен() Экспорт
+ 
+    ClientID      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
+    ClientSecret  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret");
+    Code          = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Code");
+    
+    Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code);
+           
+    Если ЗначениеЗаполнено(Результат["access_token"])
+        И ЗначениеЗаполнено(Результат["refresh_token"]) Тогда
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token"  , Результат["access_token"]);
+        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Refresh", Результат["refresh_token"]);
+    
+    КонецЕсли;
+    
+    OPI_Инструменты.Пауза(5);
+      
+КонецПроцедуры
+
+Процедура ГВ_ОбновитьТокен() Экспорт
+ 
+    ClientID      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
+    ClientSecret  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret");
+    RefreshToken  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Refresh");
+    
+    Результат = OPI_GoogleWorkspace.ОбновитьТокен(ClientID, ClientSecret, RefreshToken);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");                
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено();
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token", Результат["access_token"]);
+    
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleCalendar
+
+Процедура ГК_ПолучитьСписокКалендарей() Экспорт
+ 
+    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");    
+    Результат = OPI_GoogleCalendar.ПолучитьСписокКалендарей(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+        .ИмеетТип("Массив");
+
+    OPI_Инструменты.Пауза(5);
+            
+КонецПроцедуры
+
+Процедура ГК_СоздатьУдалитьКалендарь() Экспорт
+ 
+    Токен                   = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); 
+    Наименование            = "Тестовый календарь";
+    Описание                = "Тестовое описание";
+    НаименованиеИзмененное  = Наименование + " (изм.)";
+    ТипСоответствие         = Тип("Соответствие");
+    ТипСтрока               = Тип("Строка");
+    Summary                 = "summary";
+    Черный                  = "#000000";
+    Желтый                  = "#ffd800";
+    
+    Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование); 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено();
+        
+    Календарь = Результат["id"];
+    
+    Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен
+        , Календарь
+        , НаименованиеИзмененное
+        , Описание);
+        
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря");
+    
+    Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+        
+    Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря");  
+    
+    Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+
+    Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок");
+    
+    Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+    
+    Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
+        
+    Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие); 
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
+
+    Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь");
+    
+    Проверка_Пусто(Результат);
+    
+    Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка");
+    
+    Проверка_Пусто(Результат);
+    
+    Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарь");
+    
+    Проверка_Пусто(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ГК_СоздатьУдалитьСобытие() Экспорт
+ 
+    ТекущаяДата     = OPI_Инструменты.ПолучитьТекущуюДату();
+    Токен           = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token"); 
+    Календарь       = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
+    Наименование    = "Новое событие";
+    Описание        = "Описание тестового события";
+    ОписаниеИзм     = "Описание тестового события (изм.)";
+    UID             = "id";
+    Час             = 3600;
+
+    Вложения        = Новый Соответствие;
+    
+    Вложения.Вставить("Картинка1"
+        , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png");
+    Вложения.Вставить("Картинка2"
+        , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1");
+    
+    СоответствиеСобытия = Новый Соответствие;
+    СоответствиеСобытия.Вставить("Описание"                 , Описание);
+    СоответствиеСобытия.Вставить("Заголовок"                , Наименование);
+    СоответствиеСобытия.Вставить("МестоПроведения"          , "В офисе");
+    СоответствиеСобытия.Вставить("ДатаНачала"               , ТекущаяДата);
+    СоответствиеСобытия.Вставить("ДатаОкончания"            , СоответствиеСобытия["ДатаНачала"] + Час);
+    СоответствиеСобытия.Вставить("МассивURLФайловВложений"  , Вложения);
+    СоответствиеСобытия.Вставить("ОтправлятьУведомления"    , Истина);
+    
+    Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие");
+    
+    Событие   = Результат[UID];
+    
+    Проверка_ГКОбъект(Результат, Наименование, Описание);
+      
+    СоответствиеСобытия = Новый Соответствие;  
+    СоответствиеСобытия.Вставить("Описание", ОписаниеИзм);
+    
+    Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие");
+    
+    Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+        
+    Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие");
+    
+    Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+
+    Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие");
+    
+    Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+  
+    Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие); 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие");
+       
+    Проверка_Пусто(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГК_ПолучитьСписокСобытий() Экспорт
+ 
+    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");    
+    Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
+
+    Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив");
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleDrive
+
+Процедура ГД_ПолучитьСписокКаталогов() Экспорт
+ 
+    MimeType  = "mimeType";
+    Name      = "name";
+    Имя       = "Тестовая папка";
+    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+    Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов");
+    
+    Результат = Результат[0];
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
+    
+    OPI_Инструменты.Пауза(5);
+    Идентификатор = Результат["id"];
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор);
+    
+    Результат   = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
+    
+    OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт
+ 
+    ЛишниеБайты = 2;
+    
+    Kind      = "kind";
+    Content   = "content";
+    MIME      = "MIME";
+    MimeType  = "mimeType";
+    Name      = "name";
+    Id_       = "id";
+    
+    МассивУдаляемых = Новый Массив;
+    Токен           = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+    Картинка        = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+    КартинкаЗамены  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2");
+    Каталог         = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
+    
+    Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла();
+    Описание.Вставить("Родитель", Каталог);
+   
+    Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]);
+
+    Идентификатор = Результат[Id_];
+    МассивУдаляемых.Добавить(Идентификатор);
+    
+    НовоеИмя  = "Скопированный файл.jpeg";
+    Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root");
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект");
+    
+    OPI_Инструменты.Пауза(5);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
+       
+    МассивУдаляемых.Добавить(Результат[Id_]);
+    
+    Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты);
+    OPI_Инструменты.Пауза(5);
+    
+    НовоеИмя  = "Обновленный файл.jpg";
+    Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
+
+    OPI_Инструменты.Пауза(5);
+    
+    Комментарий = "Yo";
+    Результат   = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+  
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
+    
+    OPI_Инструменты.Пауза(5);
+     
+    Для Каждого Удаляемый Из МассивУдаляемых Цикл
+        Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый);    
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
+      
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
+        OPI_Инструменты.Пауза(2);
+    КонецЦикла;
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура ГД_СоздатьУдалитьКомментарий() Экспорт
+    
+    Kind      = "kind";
+    Content   = "content";
+    Id_       = "id";
+    Comments  = "comments";
+    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+    Каталог   = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
+    Картинка  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+    
+    Описание  = OPI_GoogleDrive.ПолучитьОписаниеФайла();
+    Описание.Вставить("Родитель", Каталог);
+    
+    Результат     = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
+    Идентификатор = Результат[Id_];
+    
+    Комментарий         = "Новый комментарий";
+    МассивРезультатов   = Новый Массив;
+    Результат           = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+    
+    ИДКомментария       = Результат[Id_];
+    
+    МассивРезультатов.Добавить(Результат);
+    
+    Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий");
+    
+    МассивРезультатов.Добавить(Результат);
+    
+    Результат         = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев");
+    
+    Комментарии       = Результат[Comments];
+    ОбъектКомментарий = Комментарии[Комментарии.ВГраница()];
+    
+    МассивРезультатов.Добавить(ОбъектКомментарий);
+    
+    Для Каждого Результат Из МассивРезультатов Цикл     
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
+    КонецЦикла;
+    
+    Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария);    
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
+
+    OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор);
+        
+КонецПроцедуры
+
+Процедура ГД_СоздатьКаталог() Экспорт
+    
+    Name       = "name";
+    Имя        = "Тестовая папка";
+    Токен      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+    Каталог    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
+    
+    МассивРезультатов = Новый Массив;
+    
+    МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя));
+    МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог));
+    
+    Для Каждого Результат Из МассивРезультатов Цикл
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
+        
+        ИДКаталога = Результат["id"];
+                
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя);
+        
+        OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога);
+        
+    КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleSheets
+
+Процедура ГТ_СоздатьТаблицу() Экспорт
+    
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+    Наименование = "Тестовая таблица";
+    
+    МассивЛистов = Новый Массив;
+    МассивЛистов.Добавить("Лист1");
+    МассивЛистов.Добавить("Лист2");
+    
+    Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКнигу");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование);
+
+    Для Н = 0 По МассивЛистов.ВГраница() Цикл
+        
+        ИмяЛиста = Результат["sheets"][Н]["properties"]["title"];
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(ИмяЛиста).Равно(МассивЛистов[Н]);
+        Лист = Результат["sheets"][Н]["properties"]["sheetId"];
+        Лист = OPI_Инструменты.ЧислоВСтроку(Лист);
+        
+    КонецЦикла;
+    
+    Книга   = Результат["spreadsheetId"];
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Spreadsheet", Книга);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Sheet"      , Лист);
+    
+    Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
+    Книга2  = Результат["spreadsheetId"];
+    
+    Результат = OPI_GoogleSheets.КопироватьЛист(Токен, Книга, Книга2, Лист);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист");
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)");
+    
+    Наименование = "Тестовый лист";
+        
+    Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист");
+
+    НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"];
+    НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга); 
+
+    Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+    
+    Наименование = "Тестовая таблица (изм.)";
+    
+    Результат    = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+    
+КонецПроцедуры
+
+Процедура ГТ_ПолучитьТаблицу() Экспорт
+    
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+    Книга        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
+    Наименование = "Тестовая таблица (изм.)";
+
+    Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицу");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование);
+
+КонецПроцедуры
+
+Процедура ГТ_ЗаполнитьОчиститьЯчейки() Экспорт
+    
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+    Книга        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
+    Лист         = "Лист2";
+
+    СтруктураЯчеек = Новый Соответствие;
+    СтруктураЯчеек.Вставить("A1", "Это A1");
+    СтруктураЯчеек.Вставить("A2", "Это A2");
+    СтруктураЯчеек.Вставить("B2", "Это B2");
+    СтруктураЯчеек.Вставить("B3", "Это B3");
+    СтруктураЯчеек.Вставить("A3", "Это A3");
+    СтруктураЯчеек.Вставить("A4", "Это A4");
+    СтруктураЯчеек.Вставить("B1", "Это B1");
+    СтруктураЯчеек.Вставить("B4", "Это B4");
+    
+    МассивЯчеек = Новый Массив;
+    МассивЯчеек.Добавить("B2");
+    МассивЯчеек.Добавить("A3");
+    МассивЯчеек.Добавить("B4");
+
+    Результат = OPI_GoogleSheets.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество());
+    
+    Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество());
+    
+    Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+    
+    МассивЯчеек = Новый Массив;
+    МассивЯчеек.Добавить("B2");
+    МассивЯчеек.Добавить("A3");
+    МассивЯчеек.Добавить("B4");
+
+    Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьЯчейки");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["clearedRanges"].Количество()).Равно(МассивЯчеек.Количество());
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Twitter
+
+Процедура Твиттер_ПолучитьСсылкуАвторизации() Экспорт
+ 
+    Параметры = ПолучитьПараметрыТвиттер();
+    Результат = OPI_Twitter.ПолучитьСсылкуАвторизации(Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_URL", Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Твиттер_ОбновитьТокен() Экспорт
+ 
+    Параметры = ПолучитьПараметрыТвиттер();
+    Результат = OPI_Twitter.ОбновитьТокен(Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["refresh_token"]).Заполнено();
+        
+    Рефреш = Результат["refresh_token"];
+    Токен  = Результат["access_token"];
+    
+    Если ЗначениеЗаполнено(Рефреш) И Не Рефреш = "null" Тогда   
+        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Refresh", Рефреш);
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(Токен) И Не Токен = "null" Тогда
+        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Token"  , Токен);
+    КонецЕсли;
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТекстовыйТвит() Экспорт
+ 
+    Параметры = ПолучитьПараметрыТвиттер();
+    Текст     = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+    
+    Результат = OPI_Twitter.СоздатьТекстовыйТвит(Текст, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит");
+    
+    Проверка_ТвиттерТекст(Результат, Текст);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт
+ 
+    Параметры = ПолучитьПараметрыТвиттер();
+    Текст     = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+    Картинка  = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+    ИВФ       = ПолучитьИмяВременногоФайла("png");
+    Картинка.Записать(ИВФ);
+   
+    Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры); 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
+    
+    Проверка_ТвиттерТекст(Результат, Текст);    
+    
+    Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
+    
+    Проверка_ТвиттерТекст(Результат, Текст);
+    
+    УдалитьФайлы(ИВФ);
+    
+    OPI_Инструменты.Пауза(20);
+    
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСВидео() Экспорт
+ 
+    Параметры = ПолучитьПараметрыТвиттер();
+    Текст     = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+    Видео     = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video");
+    ИВФ       = ПолучитьИмяВременногоФайла("mp4");
+    Видео.Записать(ИВФ);
+   
+    Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры);    
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
+    
+    Проверка_ТвиттерТекст(Результат, Текст);    
+    
+    Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
+    
+    Проверка_ТвиттерТекст(Результат, Текст);
+    
+    УдалитьФайлы(ИВФ);
+    
+    OPI_Инструменты.Пауза(20);
+    
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСГиф() Экспорт
+ 
+    Параметры = ПолучитьПараметрыТвиттер();
+    Текст     = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+    Гифка     = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF");
+    ИВФ       = ПолучитьИмяВременногоФайла("gif");
+    Гифка.Записать(ИВФ);
+   
+    Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры);   
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
+     
+    Проверка_ТвиттерТекст(Результат, Текст);    
+    
+    Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
+    
+    Проверка_ТвиттерТекст(Результат, Текст);
+    
+    УдалитьФайлы(ИВФ);
+    
+    OPI_Инструменты.Пауза(20);
+    
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСОпросом() Экспорт
+ 
+    Параметры       = ПолучитьПараметрыТвиттер();
+    Текст           = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+    МассивОтветов   = Новый Массив;
+    МассивОтветов.Добавить("Вариант 1");
+    МассивОтветов.Добавить("Вариант 2");
+   
+    Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры);
+ 
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос");
+    
+    Проверка_ТвиттерТекст(Результат, Текст);
+    
+    OPI_Инструменты.Пауза(20);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Notion
+
+Процедура Ноушн_СоздатьСтраницу() Экспорт
+	
+	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	Родитель  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
+	Заголовок = "Тестовый заголовок";
+	 
+	Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницу");
+    
+    Проверка_НоушнОбъект(Результат);
+
+КонецПроцедуры
+
+Процедура Ноушн_СоздатьИзменитьБазу() Экспорт
+	
+	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	Родитель  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
+	Заголовок = "Тестовый заголовок";
+	
+	Свойства = Новый Соответствие;
+	Свойства.Вставить("Имя"            , "title");
+	Свойства.Вставить("Описание"       , "rich_text");
+	Свойства.Вставить("Номер"          , "number");
+	Свойства.Вставить("Статус"         , "status");
+	Свойства.Вставить("Дата создания"  , "date");
+	Свойства.Вставить("Картинка"       , "files");
+	Свойства.Вставить("Активен"        , "checkbox");
+	Свойства.Вставить("Сайт"           , "url");
+	Свойства.Вставить("Почта"          , "email");
+	Свойства.Вставить("Телефон"        , "phone_number");
+	Свойства.Вставить("Пользователь"   , "people");
+	
+	ВыборЗначения = Новый Соответствие;
+	ВыборЗначения.Вставить("Новый", "green");
+	ВыборЗначения.Вставить("В работе", "yellow");
+	ВыборЗначения.Вставить("Удаленный", "red");
+	Свойства.Вставить("Статус", ВыборЗначения);
+	
+	Результат = OPI_Notion.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства); 
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных");
+    
+    Проверка_НоушнОбъект(Результат, "database");
+    
+    База      = Результат["id"];
+    Заголовок = "Тестовый заголовок";
+	Описание  = "Тестовое описание";
+	
+	Свойства = Новый Соответствие;
+	Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст
+	Свойства.Вставить("Сайт");               // Поле "Сайт" будет удалено
+	
+	Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы");
+    
+    Проверка_НоушнОбъект(Результат, "database");
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт
+	
+	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	Страница  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
+	
+	Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу");
+    
+    Проверка_НоушнОбъект(Результат);	
+    
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт
+
+	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	База      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
+		
+	Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных");
+    
+    Проверка_НоушнОбъект(Результат, "database");
+    
+КонецПроцедуры
+
+Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт
+	
+	Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	База  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
+	
+	Картинка = Новый Соответствие;
+	Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"));
+	
+	Свойства = Новый Соответствие;
+	Свойства.Вставить("Имя"            , "ООО Вектор");
+	Свойства.Вставить("Описание"       , "Наш первый клиент");
+	Свойства.Вставить("Номер"          , 1);
+	Свойства.Вставить("Статус"         , "Обычный");
+	Свойства.Вставить("Дата создания"  , OPI_Инструменты.ПолучитьТекущуюДату());
+	Свойства.Вставить("Картинка"       , Картинка);
+	Свойства.Вставить("Активен"        , Истина);
+	Свойства.Вставить("Сайт"           , "https://vector.ru");
+	Свойства.Вставить("Почта"          , "mail@vector.ru");
+	Свойства.Вставить("Телефон"        , "88005553535");
+	Свойства.Вставить("Статус"	       , "Новый");
+	
+	Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу");
+    
+    Проверка_НоушнОбъект(Результат);
+    
+    Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", "");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База);
+       	 
+КонецПроцедуры
+
+Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт
+	
+	Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	Страница     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
+	Иконка       = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
+	Обложка      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2");
+	Архивировать = Ложь;
+	
+	Свойства = Новый Соответствие;
+	Свойства.Вставить("Активен"     , Ложь);
+	Свойства.Вставить("Почта"       , "vector@mail.ru");
+	
+	Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен
+		, Страница
+		, Свойства
+		, Иконка
+		, Обложка
+		, Архивировать);
+          
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы");
+    
+    Проверка_НоушнОбъект(Результат);
+    
+КонецПроцедуры
+
+Процедура Ноушн_СоздатьУдалитьБлок() Экспорт
+	
+	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	Родитель  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
+	Блок      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block");
+	
+	Результат = OPI_Notion.ВернутьБлок(Токен, Блок);	
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок");
+    
+    Проверка_НоушнОбъект(Результат, "block");
+    
+	Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок");
+    
+    Проверка_НоушнОбъект(Результат, "list");
+    
+    Блок      = Результат["results"][0]["id"];
+	Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки");
+    
+    Проверка_НоушнОбъект(Результат, "list");
+    
+	Результат = OPI_Notion.УдалитьБлок(Токен, Блок);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок");
+    
+    Проверка_НоушнОбъект(Результат, "block");
+    
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьПользователей() Экспорт
+	
+	Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	Результат = OPI_Notion.СписокПользователей(Токен);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей");
+    
+    Проверка_НоушнОбъект(Результат, "list");
+    
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт
+	
+	Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+	Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User"); 
+	Результат    = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь);
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
+    
+    Проверка_НоушнОбъект(Результат, "user");
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Slack
+
+Процедура Слак_ПолучитьИнформациюОБоте() Экспорт
+    
+    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено();
+    
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокПользователей() Экспорт
+    
+    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Результат = OPI_Slack.ПолучитьСписокПользователей(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
+    
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокОбластей() Экспорт
+    
+    Токен     = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив");
+    
+КонецПроцедуры
+
+Процедура Слак_ОтправитьУдалитьСообщение() Экспорт
+
+    Токен    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); 
+    Канал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+    Текст    = "Тестовое сообщение 1";
+    Текст2   = "Тестовое сообщение 2";
+    Отметки  = Новый Массив;
+    Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
+    
+    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст);
+    
+    Отметка = Результат["ts"];
+    
+    Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2);
+        
+    Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
+    
+    Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено();
+        
+    Проверка_СлакОк(Результат);
+      
+    Отметки.Добавить(Отметка);
+    
+    МассивБлоков = Новый Массив;
+    Блок         = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
+    МассивБлоков.Добавить(Блок);
+    
+    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+    
+    Отметки.Добавить(Результат["ts"]);
+    
+    Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
+    БлокJSON = OPI_Инструменты.JSONСтрокой(Блок);
+    
+    ИВФ = ПолучитьИмяВременногоФайла("json");
+    
+    ТекстовыйДокумент = Новый ТекстовыйДокумент();
+    ТекстовыйДокумент.УстановитьТекст(БлокJSON);
+    ТекстовыйДокумент.Записать(ИВФ);
+        
+    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+    
+    Отметки.Добавить(Результат["ts"]);
+    
+    Блоки = "['" + ИВФ + "','" + ИВФ + "']";
+    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+    
+    Отметки.Добавить(Результат["ts"]);
+
+    УдалитьФайлы(ИВФ);
+ 
+    Для Каждого Отметка Из Отметки Цикл
+        
+        Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка);
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
+
+        Проверка_СлакОк(Результат);
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+    
+    КонецЦикла;
+    
+    Час       = 3600;
+    Сутки     = 24;
+    Отправка  = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час);
+    Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено();
+    
+    Отметка   = Результат["scheduled_message_id"];
+    Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
+
+    Проверка_СлакОк(Результат);
+
+КонецПроцедуры
+
+Процедура Слак_ОтправитьУдалитьЭфемерное() Экспорт
+   
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); 
+    Канал        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
+    Картинка     = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
+    Текст        = "Тестовое сообщение 1";
+    
+    Блок      = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
+    Результат = OPI_Slack.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено();
+     
+КонецПроцедуры
+
+Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт
+    
+    Токен    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token"); 
+    Канал    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+    
+    Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив");
+   
+КонецПроцедуры
+
+Процедура Слак_СоздатьАрхивироватьКанал() Экспорт
+    
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
+    Имя          = "testconv" + Строка(Новый УникальныйИдентификатор);
+    Тема         = "Тестовая тема";
+    Цель         = "Тестовая цель";
+    
+    #Область СоздатьКанал
+    Результат = OPI_Slack.СоздатьКанал(Токен, Имя);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал");
+    
+    Данные = Результат["channel"];
+    Канал  = Данные["id"];
+
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+    #КонецОбласти
+
+    #Область УстановитьТемуКанала
+    Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала");
+    
+    Данные = Результат["channel"];
+    Канал  = Данные["id"];
+
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема);
+    #КонецОбласти
+    
+    #Область УстановитьЦельКанала
+    Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала");
+    
+    Проверка_СлакОк(Результат);
+    #КонецОбласти
+    
+    #Область ПолучитьКанал
+    Результат = OPI_Slack.ПолучитьКанал(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал");
+    
+    Данные = Результат["channel"];
+    Канал  = Данные["id"];
+
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+    #КонецОбласти
+    
+    #Область ПригласитьПользователейВКанал
+    Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал");
+    
+    Данные = Результат["channel"];
+    Канал  = Данные["id"];
+
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+    #КонецОбласти
+    
+    #Область ВыгнатьПользователяИзКанала
+    Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала");
+    
+    Проверка_СлакОк(Результат);
+    #КонецОбласти
+    
+    #Область ПолучитьИсториюКанала
+    Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала");
+        
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
+    #КонецОбласти
+    
+    #Область ПолучитьСписокПользователейКанала
+    Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала");
+        
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
+    #КонецОбласти
+
+    #Область ПокинутьКанал
+    Результат = OPI_Slack.ПокинутьКанал(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал");
+    
+    Проверка_СлакОк(Результат);
+    #КонецОбласти
+    
+    #Область ВступитьВКанал
+    Результат = OPI_Slack.ВступитьВКанал(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал");
+    
+    Данные = Результат["channel"];
+    Канал  = Данные["id"];
+
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+    #КонецОбласти
+    
+    #Область ПереименоватьКанал
+    НовоеИмя  = "testconv" + Строка(Новый УникальныйИдентификатор);
+    Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал");
+    
+    Данные = Результат["channel"];
+    Канал  = Данные["id"];
+
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя);
+    #КонецОбласти
+    
+    #Область АрхивироватьКанал
+    Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал");
+    
+    Проверка_СлакОк(Результат);
+    #КонецОбласти
+    
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокКаналов() Экспорт
+    
+    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    
+    Результат = OPI_Slack.ПолучитьСписокКаналов(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов");
+
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив");
+    
+КонецПроцедуры
+
+Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт
+    
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
+    Текст        = "Yo, dude";
+    
+    Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог");
+
+    Диалог = Результат["channel"]["id"];
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено();
+    
+    Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+    
+    Проверка_СлакОк(Результат);
+
+    Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог");
+
+    Проверка_СлакОк(Результат);
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокФайлов() Экспорт
+    
+    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+    
+    Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
+
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт
+    
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Файл         = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document");
+    Канал        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+    МассивФайлов = Новый Массив;
+    ИмяФайла     = "megadoc.docx";
+    Заголовок    = "Новый файл";
+    
+    Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+    ЗагруженныйФайл = Результат["files"][0];
+    МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+    
+    Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)");
+
+    ЗагруженныйФайл = Результат["files"][0];
+    МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+    
+    Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл");
+    
+    ЗагруженныйФайл = Результат["file"];
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+        
+    Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл
+        
+        Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл);
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл");
+        
+        Проверка_СлакОк(Результат);
+        
+    КонецЦикла;
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокВФ() Экспорт
+    
+    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+    
+    Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+    
+    Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+    
+КонецПроцедуры
+
+Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт
+    
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+    Файл         = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
+    Канал        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+    Заголовок    = "Новый файл";
+    
+    Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл");
+    
+    ЗагруженныйФайл = Результат["file"];
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
+    
+    Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл");
+    
+    ЗагруженныйФайл = Результат["file"];
+    
+    Проверка_СлакОк(Результат);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
+    
+    Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
+    
+    Проверка_СлакОк(Результат);
+    
+    Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
+    
+    Проверка_СлакОк(Результат);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Airtable
+
+Процедура АТ_СоздатьБазу() Экспорт
+    
+    Токен        = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+    Область      = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace");
+    Наименование = "Тестовая база";
+    
+    МассивПолей = Новый Массив;
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
+    
+    ИмяТаблицы = "Тестовая таблица";
+    
+    СоответствиеТаблиц = Новый Соответствие;
+    СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей);
+    
+    Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы);
+    
+    База = Результат["id"];
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База);
+    
+    Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив");
+
+    Результат = OPI_Airtable.ПолучитьСписокБаз(Токен);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив");
+ 
+КонецПроцедуры
+
+Процедура АТ_СоздатьТаблицу() Экспорт
+    
+    Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+    База  = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+    
+    МассивПолей = Новый Массив;
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера");
+    
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое");
+    
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение"));
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения");
+    
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок"));
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка");
+    
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата"));
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты");
+    
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон"));
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона");
+        
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта"));
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты");    
+    
+    МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка"));
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки");    
+    
+    ИмяТаблицы = "Тестовая таблица 2";
+    Описание   = "Новая таблица";
+    
+    Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+    
+    Таблица    = Результат["id"];
+    ИмяТаблицы = "Тестовая таблица 2 (изм.)";
+    Описание   = "Новая таблица (изм.)";
+   
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица);
+    
+    Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+
+КонецПроцедуры
+
+Процедура АТ_СоздатьПоле() Экспорт
+    
+    Токен   = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+    База    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+    Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
+    Имя     = Строка(Новый УникальныйИдентификатор);
+    
+    Поле = OPI_Airtable.ПолучитьПолеНомера(Имя);
+    
+    Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
+    
+    Поле      = Результат["id"]; 
+    Имя       = Имя + "(изм.)";
+    Описание  = "Новое описание";
+    
+    Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+    
+КонецПроцедуры
+
+Процедура АТ_СоздатьУдалитьЗаписи() Экспорт
+
+    Токен   = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+    База    = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+    Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
+    
+    Числовой = 10;
+    Строчный = "Привет";
+    
+    ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный);
+    ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный);
+    
+    МассивУдаляемых = Новый Массив;
+    МассивОписаний  = Новый Массив;
+    МассивОписаний.Добавить(ОписаниеСтроки1);
+    МассивОписаний.Добавить(ОписаниеСтроки2);
+    
+    Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний);
+
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2);
+    
+    Для Каждого Запись Из Результат["records"] Цикл
+        МассивУдаляемых.Добавить(Запись["id"]);
+    КонецЦикла;
+        
+    Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)");
+    
+    ОдиночнаяЗапись = Результат["id"];
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный);
+  
+    Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись);
+    
+    Текст     = "Тестовый комментарий";
+    Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
+    
+    Коммент   = Результат["id"];
+    Текст     = "Тестовый комментарий (изм.)";
+    Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
+    
+    Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив");
+    
+    Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент);
+     
+    Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
+    
+    Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
+      
+    Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
+        
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Dropbox
+
+Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт
+    
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appkey"   , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appsecret", ПараметрыТеста);
+   
+    Dropbox_ПолучитьСсылкуАвторизации(ПараметрыТеста); 
+    
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Code", ПараметрыТеста);
+
+    Dropbox_ПолучитьТокен(ПараметрыТеста);
+    
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Refresh", ПараметрыТеста);
+    
+    Dropbox_ОбновитьТокен(ПараметрыТеста);
+       
+КонецПроцедуры
+
+Процедура ДропБокс_ЗагрузитьФайл() Экспорт
+    
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста);
+    
+    Dropbox_ЗагрузитьФайл(ПараметрыТеста);
+    Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыТеста);
+    Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыТеста);
+    Dropbox_ВосстановитьОбъектКВерсии(ПараметрыТеста);
+    Dropbox_ПолучитьПревью(ПараметрыТеста);
+    Dropbox_СкачатьФайл(ПараметрыТеста);
+    Dropbox_ПереместитьОбъект(ПараметрыТеста);
+    Dropbox_КопироватьОбъект(ПараметрыТеста);
+    Dropbox_УдалитьОбъект(ПараметрыТеста);
+        
+КонецПроцедуры
+
+Процедура ДропБокс_СоздатьКаталог() Экспорт
+    
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+    
+    Dropbox_СоздатьПапку(ПараметрыТеста);
+    Dropbox_СкачатьПапку(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура ДропБокс_ПолучитьСписокФайловПапки() Экспорт
+    
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+    
+    Dropbox_ПолучитьСписокФайловПапки(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура ДропБокс_ЗагрузитьФайлПоURL() Экспорт
+    
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document", ПараметрыТеста);
+    
+    Dropbox_ЗагрузитьФайлПоURL(ПараметрыТеста);
+    Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура ДропБокс_СоздатьУдалитьТег() Экспорт
+    
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+    
+    Dropbox_ДобавитьТег(ПараметрыТеста);
+    Dropbox_ПолчитьСписокТегов(ПараметрыТеста);
+    Dropbox_УдалитьТег(ПараметрыТеста);
+    
+КонецПроцедуры
+
+Процедура ДропБокс_ПолучитьАккаунт() Экспорт
+  
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+    
+    Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыТеста);
+    Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыТеста);
+      
+КонецПроцедуры
+
+Процедура ДропБокс_РаботаСДоступами() Экспорт
+    
+    ПараметрыТеста = Новый Структура;
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token"    , ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_OtherUser", ПараметрыТеста);
+    OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_FileID"   , ПараметрыТеста);
+    
+    Dropbox_ДобавитьПользователейКФайлу(ПараметрыТеста);
+    Dropbox_ОпубликоватьПапку(ПараметрыТеста);
+    Dropbox_ДобавитьПользователейКПапке(ПараметрыТеста);
+    Dropbox_ОтменитьПубликациюПапки(ПараметрыТеста);
+    Dropbox_ОтменитьПубликациюФайла(ПараметрыТеста);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьПараметрыВК() 
+    
+    Параметры   = Новый Структура;
+    НомерГруппы = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_GroupID");
+    
+    Параметры.Вставить("access_token"  , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_Token"));
+    Параметры.Вставить("owner_id"      , "-" + НомерГруппы);
+    Параметры.Вставить("app_id"        , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AppID"));
+    Параметры.Вставить("group_id"      , НомерГруппы);
+    
+    Возврат Параметры;
+    
+КонецФункции
+
+Функция ПолучитьПараметрыТвиттер() 
+    
+    Параметры = Новый Соответствие;
+              
+    Параметры.Вставить("redirect_uri"          , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Redirect"));
+    Параметры.Вставить("client_id"             , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClinetID"));
+    Параметры.Вставить("client_secret"         , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClientSecret"));
+    Параметры.Вставить("access_token"          , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Token"));
+    Параметры.Вставить("refresh_token"         , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Refresh"));
+    Параметры.Вставить("oauth_token"           , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthToken"));
+    Параметры.Вставить("oauth_token_secret"    , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthSecret"));
+    
+    Параметры.Вставить("oauth_consumer_key"    
+        , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerKey"));
+    Параметры.Вставить("oauth_consumer_secret" 
+        , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerSecret"));
+
+    Возврат Параметры;
+    
+КонецФункции
+
+#Область Проверки
+
+Процедура Проверка_Пусто(Знач Результат)   
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
+КонецПроцедуры
+
+Процедура Проверка_ДвоичныеДанные(Знач Результат, Знач Размер = Неопределено)
+    
+    МинимальныйРазмер = 500000;
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); 
+    
+    Если Не Размер = Неопределено Тогда
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Размер); 
+    Иначе
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер() > МинимальныйРазмер).Равно(Истина);
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмИстина(Знач Результат)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
+        
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмИнформацияБота(Знач Результат)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["username"]).Заполнено();
+    
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмМассив(Результат)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив");
+    
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмУстановкаВебхук(Знач Результат)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Webhook was set");
+    
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмУдалениеВебхук(Знач Результат)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Заполнено();
+    
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмСообщение(Знач Результат, Знач Текст)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["text"]).Равно(Текст);
+    	
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмКартинка(Знач Результат, Знач Текст)
+	
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["photo"]).ИмеетТип("Массив");
+        
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмВидео(Знач Результат, Знач Текст)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["video"]["mime_type"]).Равно("video/mp4");
+    	
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмАудио(Знач Результат, Знач Текст)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["audio"]["mime_type"]).Равно("audio/mpeg");
+            
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмДокумент(Знач Результат, Знач Текст)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["document"]).ИмеетТип("Соответствие").Заполнено();  
+      
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмГифка(Знач Результат, Знач Текст)
+
+    Result = "result";
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["caption"]).Равно(Текст);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["document"]).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["animation"]["mime_type"]).Равно("video/mp4");
+            
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмМедиагруппа(Знач Результат)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив");
+            
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмМестоположение(Знач Результат)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["location"]).ИмеетТип("Соответствие").Заполнено();   
+     
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмКонтакт(Знач Результат, Знач Имя)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]["first_name"]).Равно(Имя);
+            
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмОпрос(Знач Результат, Знач Вопрос)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]["question"]).Равно(Вопрос);
+        	
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмПереслать(Знач Результат, Знач IDСообщения)
+	
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["forward_origin"]["message_id"]).Равно(Число(IDСообщения));
+    
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмБан(Знач Результат)
+	
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Bad Request: can't remove chat owner");
+    	
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмПриглашение(Знач Результат, Знач Заголовок, Знач UnixИстечение)
+
+    Result        = "result";
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["member_limit"]).Равно(200);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["name"]).Равно(Заголовок);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["expire_date"]).Равно(Число(UnixИстечение));
+    	
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмЧисло(Знач Результат)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Число");
+    	
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмСозданиеТемы(Знач Результат, Знач Имя, Иконка)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["name"]).Равно(Имя);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["icon_custom_emoji_id"]).Равно(Иконка);
+    	
+КонецПроцедуры
+
+Процедура Проверка_ВКПост(Знач Результат)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["post_id"]).ИмеетТип("Число").Заполнено();
+        
+КонецПроцедуры
+
+Процедура Проверка_ВКИстина(Знач Результат)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Равно(1);
+    
+КонецПроцедуры
+
+Процедура Проверка_ВКАльбом(Знач Результат, Знач Описание)
+
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["description"]).Равно(Описание);
+        
+КонецПроцедуры
+
+Процедура Проверка_ВККартинкаАльбома(Знач Результат, Знач ОписаниеКартинки, Знач ИДАльбома)
+
+    Response    = "response";
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["text"]).Равно(ОписаниеКартинки);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["album_id"]).Равно(ИДАльбома);
+            
+КонецПроцедуры
+
+Процедура Проверка_ВКИстория(Знач Результат)
+  
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["count"]).ИмеетТип("Число").Равно(1);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["items"]).ИмеетТип("Массив").Заполнено();
+      
+КонецПроцедуры
+
+Процедура Проверка_ВКОбсуждение(Знач Результат)
+ 
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();   
+    
+КонецПроцедуры
+
+Процедура Проверка_ГКОбъект(Знач Результат, Знач Наименование, Знач Описание)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["summary"]).Равно(Наименование);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип("Строка").Заполнено();
+    
+КонецПроцедуры
+
+Процедура Проверка_ТвиттерТекст(Знач Результат, Знач Текст)
+    
+    ТекстОтвета = Результат["data"]["text"];
+    ТекстОтвета = Лев(ТекстОтвета, СтрДлина(Текст));
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ТекстОтвета).Равно(Текст);
+
+КонецПроцедуры
+
+Процедура Проверка_ВайберОк(Знач Результат)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Равно("ok");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status"]).Равно(0);
+
+КонецПроцедуры
+
+Процедура Проверка_НоушнОбъект(Знач Результат, Знач Вид = "page")
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["object"]).Равно(Вид);
+    
+КонецПроцедуры
+
+Процедура Проверка_СлакОк(Знач Результат)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксФайл(Знач Результат, Знач Путь)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path_display"]).Равно(Путь);
+    
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксМетаданные(Знач Результат, Знач Путь)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["metadata"]["path_display"]).Равно(Путь);
+    
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксМассив(Знач Результат, Знач Количество = Неопределено)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"]).ИмеетТип("Массив");
+    
+    Если Не Количество = Неопределено Тогда
+        OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"].Количество()).Равно(Количество);
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксРабота(Знач Результат)
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["async_job_id"]).Заполнено();
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксСтатус(Знач Результат)
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[".tag"]).Равно("complete");
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксТеги(Знач Результат, Знач Количество)
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"]).ИмеетТип("Массив");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"].Количество()).Равно(Количество);
+    
+КонецПроцедуры
+
+Процедура Проверка_ДропбоксАккаунт(Знач Результат)
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["account_id"]).Заполнено();
+КонецПроцедуры
+
+Процедура Проверка_ДропбоксПространство(Знач Результат)
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["used"]).Заполнено();
+КонецПроцедуры
+
+Процедура Проверка_ДропбоксУчастник(Знач Результат, Знач Почта, Знач ТолькоПросмотр)
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["result"][".tag"]).Равно("success");
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["member"]["email"]).Равно(Почта);
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(
+        Результат[0]["result"]["success"][".tag"]).Равно(?(ТолькоПросмотр, "viewer", "editor"));
+КонецПроцедуры
+
+Процедура Проверка_ДропбоксПубличнаяПапка(Знач Результат)
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["shared_folder_id"]).Заполнено();
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область АтомарныеТесты
+
+#Область Telegram
+
+Процедура Telegram_ПолучитьИнформациюБота(ПараметрыФункции)
+
+    Токен       = ПараметрыФункции["Telegram_Token"];
+    Результат   = OPI_Telegram.ПолучитьИнформациюБота(Токен);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram");
+        
+    Проверка_ТелеграмИнформацияБота(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьОбновления(ПараметрыФункции)
+	
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Результат   = OPI_Telegram.ПолучитьОбновления(Токен);
+
+	// END
+	
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram");
+    
+    Проверка_ТелеграмМассив(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Telegram_УстановитьWebhook(ПараметрыФункции)
+    
+    Токен       = ПараметрыФункции["Telegram_Token"];
+    URL         = ПараметрыФункции["Telegram_URL"];
+    
+    Результат   = OPI_Telegram.УстановитьWebhook(Токен, URL);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram");
+      
+    Проверка_ТелеграмУстановкаВебхук(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Telegram_УдалитьWebhook(ПараметрыФункции)
+	
+	Токен     = ПараметрыФункции["Telegram_Token"];
+	Результат = OPI_Telegram.УдалитьWebhook(Токен);
+	
+	// END
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram");
+      
+    Проверка_ТелеграмУдалениеВебхук(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции)
+	
+	Токен    = ПараметрыФункции["Telegram_Token"];
+	IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+	IDКанала = ПараметрыФункции["Telegram_ChannelID"];    
+	Текст    = ПараметрыФункции["String"];
+	
+    Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram"); 
+    
+    Проверка_ТелеграмСообщение(Результат, Текст); // SKIP
+    
+    Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (канал)"); 
+    
+    Проверка_ТелеграмСообщение(Результат, Текст);
+    
+    IDСообщения = OPI_Инструменты.ЧислоВСтроку(Результат["result"]["message_id"]);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_ChannelMessageID", IDСообщения);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьКартинку(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+    Текст    = ПараметрыФункции["String"];
+    Картинка = ПараметрыФункции["Picture"]; 
+    
+    КартинкаПуть = ПолучитьИмяВременногоФайла("png");
+    КопироватьФайл(Картинка, КартинкаПуть);
+    
+    КартинкаДД   = Новый ДвоичныеДанные(КартинкаПуть);
+    
+    Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, Текст, Картинка);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram");
+    
+    Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
+  
+    Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)");
+    
+    Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
+      
+    Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД);
+    
+    // END 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (ДД)");
+    
+    Проверка_ТелеграмКартинка(Результат, Текст);
+    
+    УдалитьФайлы(КартинкаПуть);
+    
+    IDФайла = Результат["result"]["photo"][0]["file_id"];
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
+    
+    ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьВидео(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+    Текст    = ПараметрыФункции["String"];
+    Видео    = ПараметрыФункции["Video"];
+    
+    ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
+    КопироватьФайл(Видео, ВидеоПуть);
+    
+    ВидеоДД   = Новый ДвоичныеДанные(ВидеоПуть);
+    
+    Результат = OPI_Telegram.ОтправитьВидео(Токен, IDЧата, Текст, Видео);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram");
+    
+    Проверка_ТелеграмВидео(Результат, Текст); // SKIP
+  
+    Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)");
+    
+    Проверка_ТелеграмВидео(Результат, Текст); // SKIP
+      
+    Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД);
+    
+    // END 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (ДД)");
+    
+    Проверка_ТелеграмВидео(Результат, Текст);
+    
+    УдалитьФайлы(ВидеоПуть);
+    
+    IDФайла = Результат["result"]["video"]["file_id"];
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
+    
+    ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьАудио(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+    Текст    = ПараметрыФункции["String"];
+    Аудио    = ПараметрыФункции["Audio"];
+    
+    АудиоПуть = ПолучитьИмяВременногоФайла("mp3");
+    КопироватьФайл(Аудио, АудиоПуть);
+    
+    АудиоДД   = Новый ДвоичныеДанные(АудиоПуть);
+    
+    Результат = OPI_Telegram.ОтправитьАудио(Токен, IDЧата, Текст, Аудио);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram");
+    
+    Проверка_ТелеграмАудио(Результат, Текст); // SKIP
+  
+    Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)");
+    
+    Проверка_ТелеграмАудио(Результат, Текст); // SKIP
+      
+    Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД);
+    
+    // END 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (ДД)");
+    
+    Проверка_ТелеграмАудио(Результат, Текст);
+    
+    УдалитьФайлы(АудиоПуть);
+    
+    IDФайла = Результат["result"]["audio"]["file_id"];
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
+    
+    ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьДокумент(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+    Текст    = ПараметрыФункции["String"];
+    Документ = ПараметрыФункции["Document"];
+    
+    ДокументПуть = ПолучитьИмяВременногоФайла("docx");
+    КопироватьФайл(Документ, ДокументПуть);
+    
+    ДокументДД   = Новый ДвоичныеДанные(ДокументПуть);
+    
+    Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDЧата, Текст, Документ);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram");
+    
+    Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
+  
+    Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)");
+    
+    Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
+      
+    Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД);
+    
+    // END 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)");
+    
+    Проверка_ТелеграмДокумент(Результат, Текст);
+    
+    УдалитьФайлы(ДокументПуть);
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьГифку(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+    Текст    = ПараметрыФункции["String"];
+    Гифка    = ПараметрыФункции["GIF"];
+    
+    ГифкаПуть = ПолучитьИмяВременногоФайла("gif");
+    КопироватьФайл(Гифка, ГифкаПуть);
+    
+    ГифкаДД   = Новый ДвоичныеДанные(ГифкаПуть);
+    
+    Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram");
+    
+    Проверка_ТелеграмГифка(Результат, Текст); // SKIP
+  
+    Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)");
+    
+    Проверка_ТелеграмГифка(Результат, Текст); // SKIP
+      
+    Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД);
+    
+    // END 
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)");
+    
+    Проверка_ТелеграмГифка(Результат, Текст);
+    
+    УдалитьФайлы(ГифкаПуть);
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    Текст    = ПараметрыФункции["String"];
+    Картинка = ПараметрыФункции["Picture"];
+    Видео    = ПараметрыФункции["Video"];
+ 
+    КартинкаПуть = ПолучитьИмяВременногоФайла("png");
+    КопироватьФайл(Картинка, КартинкаПуть);
+           
+    ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
+    КопироватьФайл(Видео, ВидеоПуть);
+    
+    ВидеоДД   = Новый ДвоичныеДанные(ВидеоПуть);
+    
+    Медиагруппа    = Новый Соответствие;
+    Медиагруппа.Вставить(КартинкаПуть, "photo");
+    Медиагруппа.Вставить(ВидеоДД     , "video");
+    
+    Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram");
+    
+    Проверка_ТелеграмМедиагруппа(Результат); 
+   
+    УдалитьФайлы(ВидеоПуть);
+    УдалитьФайлы(КартинкаПуть);
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции)
+    
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала = ПараметрыФункции["Telegram_ChannelID"];    
+    Ширина   = ПараметрыФункции["Lat"];
+    Долгота  = ПараметрыФункции["Long"];
+    
+    Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram"); 
+    
+    Проверка_ТелеграмМестоположение(Результат); // SKIP
+    
+    Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)"); 
+    
+    Проверка_ТелеграмМестоположение(Результат);
+
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала = ПараметрыФункции["Telegram_ChannelID"];    
+    Имя      = ПараметрыФункции["Name"];
+    Фамилия  = ПараметрыФункции["Surname"];
+    Телефон  = ПараметрыФункции["Phone"];
+    
+    Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата  , Имя, Фамилия, Телефон);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram"); 
+    
+    Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP
+    OPI_Инструменты.Пауза(20);                // SKIP
+    
+    Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)"); 
+    
+    Проверка_ТелеграмКонтакт(Результат, Имя);
+
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьОпрос(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Telegram_Token"];
+    IDЧата   = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала = ПараметрыФункции["Telegram_ChannelID"]; 
+    Вопрос   = "Какой ваш любимый цвет?";
+    
+    МассивОтветов     = Новый Массив;
+    МассивОтветов.Добавить("Красный");
+    МассивОтветов.Добавить("Желтый");
+    МассивОтветов.Добавить("Зеленый");
+    МассивОтветов.Добавить("Синий");
+    
+    Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата  , Вопрос, МассивОтветов, Ложь);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram");
+                
+    Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
+    
+    Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)");
+                
+    Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
+    
+    // END
+    
+    СтрочныйМассив    = "['Красный', 'Желтый','Зеленый' ,'Синий']";
+    
+    Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)");
+                
+    Проверка_ТелеграмОпрос(Результат, Вопрос);
+
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_СкачатьФайл(ПараметрыФункции)
+	
+	IDФайла = ПараметрыФункции["Telegram_FileID"];
+	Токен   = ПараметрыФункции["Telegram_Token"];
+
+    Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные");
+    	
+КонецПроцедуры
+
+Процедура Telegram_ПереслатьСообщение(ПараметрыФункции)
+
+    Токен       = ПараметрыФункции["Telegram_Token"];
+    IDЧата      = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала    = ПараметрыФункции["Telegram_ChannelID"];
+    IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+    
+    Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата);
+    
+    // END
+
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram");
+        
+	Проверка_ТелеграмПереслать(Результат, IDСообщения);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_Бан(ПараметрыФункции)
+	
+	Токен          = ПараметрыФункции["Telegram_Token"];
+    IDПользователя = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала       = ПараметрыФункции["Telegram_ChannelID"];
+    
+	Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя);
+
+	// END
+	
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram");
+    
+	Проверка_ТелеграмБан(Результат);
+	OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Telegram_Разбан(ПараметрыФункции)
+	
+    Токен          = ПараметрыФункции["Telegram_Token"];
+    IDПользователя = ПараметрыФункции["Telegram_ChatID"];
+    IDКанала       = ПараметрыФункции["Telegram_ChannelID"];
+    
+	Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя);
+
+	// END
+	
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram");
+    
+	Проверка_ТелеграмБан(Результат);
+	OPI_Инструменты.Пауза(5);
+	
+КонецПроцедуры
+
+Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции)
+
+    Токен         = ПараметрыФункции["Telegram_Token"];
+    IDКанала      = ПараметрыФункции["Telegram_ChannelID"];    
+    Сутки         = 86400;   
+    ТекущаяДата   = OPI_Инструменты.ПолучитьТекущуюДату();
+
+    Заголовок     = "Ссылка " + Строка(ТекущаяДата); 
+    Истечение     = ТекущаяДата + Сутки;
+    UnixИстечение = OPI_Инструменты.UNIXTime(Истечение);
+    
+    Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram");
+
+	Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции)
+
+    Токен       = ПараметрыФункции["Telegram_Token"];
+    IDКанала    = ПараметрыФункции["Telegram_ChannelID"];
+    IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+    
+    Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения);
+
+	// END
+	
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram");
+	
+	Проверка_ТелеграмИстина(Результат);
+        
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции)
+
+    Токен       = ПараметрыФункции["Telegram_Token"];
+    IDКанала    = ПараметрыФункции["Telegram_ChannelID"];
+    IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+    
+    Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения);
+
+	// END
+	
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram");
+	
+	Проверка_ТелеграмИстина(Результат);
+        
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции)
+	
+    Токен       = ПараметрыФункции["Telegram_Token"];
+    IDКанала    = ПараметрыФункции["Telegram_ChannelID"];
+    
+    Результат  = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram");
+    
+    Проверка_ТелеграмЧисло(Результат);
+        
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции)
+	
+	Токен       = ПараметрыФункции["Telegram_Token"];
+	Результат   = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен);
+	
+	// END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции)
+	
+	Токен  = ПараметрыФункции["Telegram_Token"];
+    Чат    = ПараметрыФункции["Telegram_ForumID"];
+    Иконка = "5357419403325481346";
+    Имя    = "Тестовая тема " + Строка(Новый УникальныйИдентификатор);
+    
+	Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка);
+	
+	// END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram");
+    
+    Тема = Результат["result"]["message_thread_id"];
+    
+    ПараметрыФункции.Вставить("Telegram_TopicID", Тема);
+    OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]);
+   
+	Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка);
+	
+	ЧатТема   = Чат + "*" + Тема;
+	Текст     = ПараметрыФункции["String"];
+    Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)");
+    
+    Проверка_ТелеграмСообщение(Результат, Текст);
+	
+КонецПроцедуры
+
+Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции)
+
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Чат         = ПараметрыФункции["Telegram_ForumID"];
+    Тема        = ПараметрыФункции["Telegram_TopicID"];
+    НовоеИмя    = "Новый тестовый заголовок";
+    НовяИконка  = "5310132165583840589";
+
+    Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram");
+        
+    Проверка_ТелеграмИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции)
+
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Чат         = ПараметрыФункции["Telegram_ForumID"];
+    Тема        = ПараметрыФункции["Telegram_TopicID"];
+
+    OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP
+    
+	Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат);       // Закрывает главную тему
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)");
+    
+    Проверка_ТелеграмИстина(Результат); // SKIP
+    
+    Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram");
+    
+    Проверка_ТелеграмИстина(Результат);
+    
+    OPI_Инструменты.Пауза(25);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции)
+
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Чат         = ПараметрыФункции["Telegram_ForumID"];
+    Тема        = ПараметрыФункции["Telegram_TopicID"];
+
+	Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат);       // Открывает главную тему
+	
+	OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)");
+    
+    Проверка_ТелеграмИстина(Результат); // SKIP
+    
+    Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram");
+    
+    Проверка_ТелеграмИстина(Результат);
+    
+    OPI_Инструменты.Пауза(25);
+    	
+КонецПроцедуры
+
+Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции)
+
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Чат         = ПараметрыФункции["Telegram_ForumID"];
+    Тема        = ПараметрыФункции["Telegram_TopicID"];
+    
+    Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема); 
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram");
+    
+    Проверка_ТелеграмИстина(Результат);
+    
+    OPI_Инструменты.Пауза(25);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции)
+
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Чат         = ПараметрыФункции["Telegram_ForumID"];
+    Тема        = ПараметрыФункции["Telegram_TopicID"];
+    
+    Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)");
+    
+    Проверка_ТелеграмИстина(Результат); // SKIP
+    
+    Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram");
+    
+    Проверка_ТелеграмИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции)
+
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Чат         = ПараметрыФункции["Telegram_ForumID"];
+    
+    Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram");
+    
+    Проверка_ТелеграмИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции)
+
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Чат         = ПараметрыФункции["Telegram_ForumID"];
+    
+    Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram");
+    
+    Проверка_ТелеграмИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции)
+
+	Заголовок   = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор);
+	Токен       = ПараметрыФункции["Telegram_Token"];
+    Чат         = ПараметрыФункции["Telegram_ForumID"];    
+	
+    Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram");
+    
+    Проверка_ТелеграмИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    	
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область VK
+
+Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции)
+
+    Приложение = ПараметрыФункции["VK_AppID"];
+    Результат  = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK");
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура VK_СоздатьПост(ПараметрыФункции)
+    
+    Параметры = ПолучитьПараметрыВК();
+    Текст     = "Пост из автотеста";
+    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
+    
+    Картинка  = ПараметрыФункции["Picture"];  // URL, Путь или Двоичные данные
+    Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные
+    
+    ИВФ = ПолучитьИмяВременногоФайла("png");   
+    КопироватьФайл(Картинка2, ИВФ);
+    
+    МассивКартинок = Новый Массив;
+    МассивКартинок.Добавить(Картинка);
+    МассивКартинок.Добавить(ИВФ);
+  
+    Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK");
+
+    Проверка_ВКПост(Результат);                         // SKIP
+    ИДПоста   = Результат["response"]["post_id"];       // SKIP
+    Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP
+    
+    Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь  ,    , Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)");
+
+    Проверка_ВКПост(Результат); 
+    
+    ИДПоста   = Результат["response"]["post_id"];       
+    Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); 
+    
+    OPI_Инструменты.Пауза(5);   
+    
+    Результат = OPI_VK.СоздатьПост(Текст, ИВФ     , Истина, URL, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)");
+
+    Проверка_ВКПост(Результат);                   
+    
+    ИДПоста = Результат["response"]["post_id"];
+    OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]);
+    
+    УдалитьФайлы(ИВФ);
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура VK_УдалитьПост(ПараметрыФункции)
+    
+    Параметры = ПолучитьПараметрыВК();
+    ИДПоста   = ПараметрыФункции["VK_PostID"];
+    
+    Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+    // END
+
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПост", "VK");
+            
+    Проверка_ВКИстина(Результат);
+    
+КонецПроцедуры
+
+Процедура VK_СоздатьСоставнойПост(ПараметрыФункции)
+
+    Параметры = ПолучитьПараметрыВК();
+    Текст     = "Пост из автотеста";
+    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
+    
+    Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
+    Видео    = ПараметрыФункции["Video"];   // URL, Путь или Двоичные данные
+    
+    ИВФ = ПолучитьИмяВременногоФайла("png");   
+    КопироватьФайл(Картинка, ИВФ);
+    
+    ЗагрузкаКартинки = OPI_VK.ЗагрузитьФотоНаСервер(ИВФ, Параметры)["response"][0];
+    ЗагрузкаВидео    = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, "Новое видео", , , Параметры);
+    
+    ВладелецКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["owner_id"]);
+    ВладелецВидео    = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["owner_id"]);
+    
+    IDКартинки       = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["id"]);
+    IDВидео          = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["video_id"]);
+    
+    МассивВложений = Новый Массив;
+    МассивВложений.Добавить("photo" + ВладелецКартинки + "_" + IDКартинки);
+    МассивВложений.Добавить("video" + ВладелецВидео + "_" + IDВидео);
+    
+    Результат = OPI_VK.СоздатьСоставнойПост(Текст, МассивВложений, Ложь, URL, Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK");
+    
+    Проверка_ВКПост(Результат);
+    УдалитьФайлы(ИВФ);    
+        
+    OPI_Инструменты.Пауза(5);
+     
+КонецПроцедуры
+
+Процедура VK_СоздатьОпрос()
+
+    Параметры = ПолучитьПараметрыВК();
+    Вопрос    = "Какой ваш любимый цвет?";
+    
+    МассивВариантов = Новый Массив;
+    МассивВариантов.Добавить("Красный");
+    МассивВариантов.Добавить("Желтый");
+    МассивВариантов.Добавить("Зеленый");
+    
+    Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK");
+    
+    Проверка_ВКПост(Результат);
+        
+    ИДПоста  = Результат["response"]["post_id"];
+    OPI_VK.УдалитьПост(ИДПоста, Параметры);
+    
+    OPI_Инструменты.Пауза(10);
+        
+КонецПроцедуры
+
+Процедура VK_СоздатьАльбом(ПараметрыФункции)
+    
+    Параметры        = ПолучитьПараметрыВК();
+    Имя              = "Альбом из автотеста";
+    Описание         = "Новый альбом из автотеста";
+      
+    Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK");
+    
+    Проверка_ВКАльбом(Результат, Описание);
+        
+    ИДАльбома  = Результат["response"]["id"];
+    ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома);
+    
+КонецПроцедуры
+
+Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции)
+    
+    Параметры        = ПолучитьПараметрыВК();
+    ОписаниеКартинки = "Картинка автотест";
+    ИДАльбома        = ПараметрыФункции["VK_AlbumID"];
+    
+    Картинка  = ПараметрыФункции["Picture"];       // URL, Путь к файлу или Двоичные данные
+    ИВФ       = ПолучитьИмяВременногоФайла("png");
+    КопироватьФайл(Картинка, ИВФ);
+    
+    Картинка  = Новый ДвоичныеДанные(ИВФ);
+    
+    Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK");
+    
+    Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
+    
+    ИДКартинки  = Результат["response"][0]["id"];                       // SKIP
+    Результат    = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);       // SKIP
+            
+    Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры);
+    
+    // END
+   
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)");
+    
+    Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
+    
+    ИДКартинки  = Результат["response"][0]["id"];
+    ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки);
+    
+    УдалитьФайлы(ИВФ);
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура VK_УдалитьКартинку(ПараметрыФункции)
+    
+    Параметры  = ПолучитьПараметрыВК();
+    ИДКартинки = ПараметрыФункции["VK_PictureID"];
+    
+    Результат  = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK");
+    
+    Проверка_ВКИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура VK_УдалитьАльбом(ПараметрыФункции)
+    
+    Параметры = ПолучитьПараметрыВК();
+    ИДАльбома = ПараметрыФункции["VK_AlbumID"];
+    
+    Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK");
+        
+    Проверка_ВКИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура VK_СоздатьИсторию(ПараметрыФункции)
+
+    Параметры = ПолучитьПараметрыВК();
+    URL       = "https://github.com/Bayselonarrend/OpenIntegrations";
+
+    Картинка  = ПараметрыФункции["Picture"];       // URL, Путь к файлу или Двоичные данные
+    ИВФ       = ПолучитьИмяВременногоФайла("png");
+    КопироватьФайл(Картинка, ИВФ);
+    Картинка  = Новый ДвоичныеДанные(ИВФ);
+       
+    Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры);
+
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK");
+    
+    Проверка_ВКИстория(Результат); // SKIP
+        
+    Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)");
+    
+    Проверка_ВКИстория(Результат);
+    
+    УдалитьФайлы(ИВФ);
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура VK_СоздатьОбсуждение(ПараметрыФункции)
+
+    Параметры       = ПолучитьПараметрыВК();
+    Название        = "Обсуждаем: какой цвет лучше?";
+    Сообщение       = "Красный, желтый, синий или какой-то другой?";
+    
+    Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK");
+    
+    Проверка_ВКОбсуждение(Результат);
+    
+    ИДОбсуждения = Результат["response"];
+    ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения);    
+    
+    OPI_Инструменты.Пауза(5);
+        
+КонецПроцедуры
+
+Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции)
+    
+    Параметры    = ПолучитьПараметрыВК();
+    ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+    Результат    = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK");
+        
+    Проверка_ВКИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура VK_ОткрытьОбсуждение(ПараметрыФункции)
+    
+    Параметры    = ПолучитьПараметрыВК();
+    ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+    Результат    = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK");
+        
+    Проверка_ВКИстина(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура VK_НаписатьВОбсуждение(ПараметрыФункции)
+    
+    Параметры    = ПолучитьПараметрыВК();
+    ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+    Сообщение    = "Мне больше нравится желтый";
+    
+    Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK");
+    
+    Проверка_ВКОбсуждение(Результат);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Dropbox
+
+Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции)
+
+    КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
+    Результат      = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox");
+        
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка");
+    
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьТокен(ПараметрыФункции)
+    
+    КлючПриложения   = ПараметрыФункции["Dropbox_Appkey"];
+    СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
+    Код              = ПараметрыФункции["Dropbox_Code"];
+
+    Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен");
+    
+    Токен  = Результат["access_token"];
+    Рефреш = Результат["refresh_token"];
+   
+    Если ЗначениеЗаполнено(Токен) Тогда
+        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
+    КонецЕсли;
+   
+    Если ЗначениеЗаполнено(Рефреш) Тогда
+        OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш);
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Процедура Dropbox_ОбновитьТокен(ПараметрыФункции)
+
+    КлючПриложения   = ПараметрыФункции["Dropbox_Appkey"];
+    СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
+    РефрешТокен      = ПараметрыФункции["Dropbox_Refresh"];
+    
+    Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен");
+    
+    Токен = Результат["access_token"];
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено();
+
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
+        
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции)
+   
+    Путь      = "/New/pic.png";  
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+     
+    Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox");
+
+    Проверка_ДропБоксФайл(Результат, Путь);
+    
+    OPI_Инструменты.Пауза(5); 
+    
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьПревью(ПараметрыФункции)
+   
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/New/mydoc.docx"; 
+    
+    Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox");
+        
+    Проверка_ДвоичныеДанные(Результат, 190834);
+        
+    OPI_Инструменты.Пауза(5); 
+     
+КонецПроцедуры
+
+Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции)
+
+    Путь      = "/New/pic.png";  
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Картинка  = ПараметрыФункции["Picture"];
+    
+    КартинкаПуть = ПолучитьИмяВременногоФайла("png");
+    КопироватьФайл(Картинка, КартинкаПуть);
+    
+    Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox");
+        
+    Проверка_ДропБоксФайл(Результат, Путь);
+    УдалитьФайлы(КартинкаПуть);
+    
+    OPI_Инструменты.Пауза(5); 
+     
+КонецПроцедуры
+
+Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции)
+   
+    Путь  = "/New/url_doc.docx";  
+    Токен = ПараметрыФункции["Dropbox_Token"];
+    URL   = ПараметрыФункции["Document"];
+    
+    Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайлПоURL", "Dropbox");
+        
+    Проверка_ДропБоксРабота(Результат);
+   
+    Работа = Результат["async_job_id"];
+   
+    ПараметрыФункции.Вставить("Dropbox_Job", Работа);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Job", Работа);
+    
+    OPI_Инструменты.Пауза(5); 
+     
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыФункции)
+
+    Токен    = ПараметрыФункции["Dropbox_Token"];
+    ИДРаботы = ПараметрыФункции["Dropbox_Job"];
+    Статус   = "in_progress";    
+    
+    Пока Статус = "in_progress" Цикл 
+        
+        Результат = OPI_Dropbox.ПолучитьСтатусЗагрузкиПоURL(Токен, ИДРаботы);
+        Статус    = Результат[".tag"];
+        
+        OPI_Инструменты.Пауза(5);
+        
+        OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox");
+        
+    КонецЦикла;
+    
+    // END
+    
+    Проверка_ДропБоксСтатус(Результат);
+    
+    Путь      = "/New/url_doc.docx";
+    Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+    
+    Проверка_ДропБоксМетаданные(Результат, Путь);
+    OPI_Инструменты.Пауза(5); 
+        
+КонецПроцедуры
+
+Процедура Dropbox_УдалитьОбъект(ПараметрыФункции)
+ 
+    Путь      = "/New/pic.png";  
+    Токен     = ПараметрыФункции["Dropbox_Token"];  
+    
+    Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox");
+
+    Проверка_ДропБоксМетаданные(Результат, Путь);
+    
+    OPI_Инструменты.Пауза(5); 
+     
+КонецПроцедуры
+
+Процедура Dropbox_КопироватьОбъект(ПараметрыФункции)
+    
+    Оригинал  = "/New/pic.png";
+    Копия     = "/New/pic_copy.png";  
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    
+    Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox");
+        
+    Проверка_ДропБоксМетаданные(Результат, Копия);
+    
+    Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия);
+    Проверка_ДропБоксМетаданные(Результат, Копия);
+        
+    OPI_Инструменты.Пауза(5); 
+    
+КонецПроцедуры
+
+Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции)
+    
+    ОригиналныйПуть  = "/New/pic.png";
+    ЦелевойПуть      = "/pic.png";  
+    Токен            = ПараметрыФункции["Dropbox_Token"];
+    
+    Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox");
+        
+    Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть);
+    
+    Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть);
+    Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть);
+        
+    OPI_Инструменты.Пауза(5); 
+    
+КонецПроцедуры
+
+Процедура Dropbox_СоздатьПапку(ПараметрыФункции)
+    
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/Новый каталог";
+    
+    Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox");
+        
+    Проверка_ДропБоксМетаданные(Результат, Путь);
+    
+    Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+    Проверка_ДропБоксМетаданные(Результат, Путь);
+        
+    OPI_Инструменты.Пауза(5); 
+    
+КонецПроцедуры
+
+Процедура Dropbox_СкачатьФайл(ПараметрыФункции)
+
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/New/pic.png"; 
+    
+    Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox");
+        
+    Проверка_ДвоичныеДанные(Результат, 2114023);
+        
+    OPI_Инструменты.Пауза(5); 
+        
+КонецПроцедуры
+
+Процедура Dropbox_СкачатьПапку(ПараметрыФункции)
+    
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/New";
+    
+    Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox");
+        
+    Проверка_ДвоичныеДанные(Результат);
+        
+    OPI_Инструменты.Пауза(5); 
+    
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции)
+ 
+    Путь      = "/New";  
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+     
+    Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox");
+
+    Проверка_ДропБоксМассив(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры 
+
+Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции)
+
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/New/pic.png"; 
+    
+    Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox");
+        
+   Проверка_ДропБоксМассив(Результат, 1);
+   
+   Ревизия = Результат["entries"][0]["rev"];
+   
+   ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия);
+   OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия);
+        
+   OPI_Инструменты.Пауза(5); 
+        
+КонецПроцедуры
+
+Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции)
+   
+    Версия    = ПараметрыФункции["Dropbox_FileRevision"];
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/New/pic.png";  
+    
+    Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox");
+    
+    Проверка_ДропБоксФайл(Результат, Путь);
+    
+    OPI_Инструменты.Пауза(5);  
+    
+КонецПроцедуры
+
+Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции)
+
+    Токен = ПараметрыФункции["Dropbox_Token"];
+    
+    МассивПутей = Новый Массив;
+    МассивПутей.Добавить("/New/Dogs.mp3");
+    МассивПутей.Добавить("/New/mydoc.docx");  
+    
+    Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox");
+    
+    Проверка_ДропБоксТеги(Результат, МассивПутей.Количество());
+    
+    Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx");
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)");
+    
+    Проверка_ДропБоксТеги(Результат, 1);
+    
+    ЕстьТег = Ложь;
+    
+    Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл
+        Если Тег["tag_text"] = "важное" Тогда
+            ЕстьТег = Истина;    
+        КонецЕсли;
+    КонецЦикла;
+    
+    OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина);
+    
+    OPI_Инструменты.Пауза(5);  
+        
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьТег(ПараметрыФункции)
+    
+    Тег       = "Важное";
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/New/mydoc.docx";  
+    
+    Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox");
+    
+    Проверка_Пусто(Результат);
+    
+    OPI_Инструменты.Пауза(5);  
+    
+КонецПроцедуры
+
+Процедура Dropbox_УдалитьТег(ПараметрыФункции)
+    
+    Тег       = "Важное";
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/New/mydoc.docx";  
+    
+    Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox");
+    
+    Проверка_Пусто(Результат);
+    
+    OPI_Инструменты.Пауза(5);  
+    
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции)
+    
+    Токен = ПараметрыФункции["Dropbox_Token"];
+    
+    Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox");
+    
+    Проверка_ДропбоксАккаунт(Результат);
+    
+    Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]);
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)");
+    
+    Проверка_ДропбоксАккаунт(Результат);
+    
+    OPI_Инструменты.Пауза(5);
+    
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции)
+  
+    Токен = ПараметрыФункции["Dropbox_Token"];
+    
+    Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox");
+    
+    Проверка_ДропбоксПространство(Результат);
+      
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции)
+    
+    Токен = ПараметрыФункции["Dropbox_Token"];
+    Почта = ПараметрыФункции["Dropbox_OtherUser"];
+    Файл  = ПараметрыФункции["Dropbox_FileID"];
+    
+    Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь);
+    
+    // END
+        
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
+    
+    Проверка_ДропбоксУчастник(Результат, Почта, Ложь);
+    
+    Почты = Новый Массив;
+    Почты.Добавить(Почта);
+    
+    Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина);
+    
+    Проверка_ДропбоксУчастник(Результат, Почта, Истина);
+    
+КонецПроцедуры
+
+Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции)
+    
+    Токен     = ПараметрыФункции["Dropbox_Token"];
+    Путь      = "/New"; 
+   
+    Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь);
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОпубликоватьПапку", "Dropbox");
+        
+    Проверка_ДропБоксПубличнаяПапка(Результат);
+   
+    IDПапки = Результат["shared_folder_id"];
+   
+    ПараметрыФункции.Вставить("Dropbox_SharedFolder", IDПапки);
+    OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_SharedFolder", IDПапки);
+        
+    OPI_Инструменты.Пауза(5); 
+
+КонецПроцедуры
+
+Процедура Dropbox_ОтменитьПубликациюПапки(ПараметрыФункции)
+    
+    Токен  = ПараметрыФункции["Dropbox_Token"];
+    Папка  = ПараметрыФункции["Dropbox_SharedFolder"];
+ 
+    Результат     = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка);
+    ТекущийСтатус = "in_progress";
+    IDРаботы      = Результат["async_job_id"];
+    
+    Пока ТекущийСтатус = "in_progress" Цикл
+        Результат     = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы);
+        ТекущийСтатус = Результат[".tag"];
+        OPI_Инструменты.Пауза(3);
+    КонецЦикла;
+    
+    // END
+    
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox");
+    
+   Проверка_ДропБоксСтатус(Результат);
+   
+   OPI_Инструменты.Пауза(5); 
+   
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции)
+    
+    Токен  = ПараметрыФункции["Dropbox_Token"];
+    Почта  = ПараметрыФункции["Dropbox_OtherUser"];
+    Папка  = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id
+    
+    Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь);
+    
+    // END
+        
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
+    
+    Проверка_Пусто(Результат);
+    
+    Почты = Новый Массив;
+    Почты.Добавить(Почта);
+    
+    Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина);
+    
+    Проверка_Пусто(Результат);
+    
+КонецПроцедуры
+
+Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции)
+	
+	Токен = ПараметрыФункции["Dropbox_Token"];
+    Файл  = ПараметрыФункции["Dropbox_FileID"];
+    
+    Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл);
+    
+    // END
+        
+    OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox");
+    
+    Проверка_Пусто(Результат);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os b/src/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
similarity index 98%
rename from ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
rename to src/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
index 5356f23c1e..4f09822b81 100644
--- a/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
+++ b/src/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
@@ -1,470 +1,470 @@
-// Расположение OS: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UsingHardcodePath-off
-// BSLLS:Typo-off
-// BSLLS:DeprecatedMessage-off
-// BSLLS:UsingServiceTag-off
-// BSLLS:ExecuteExternalCodeInCommonModule-off
-// BSLLS:DuplicateStringLiteral-off
-
-//@skip-check use-non-recommended-method
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "./internal"
-#Использовать asserts
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-Функция ПолучитьСоответствиеРазделовТестирования() Экспорт
-    
-    СтандартныеЗависимости = "[Decode, Build]";
-    ЗависимостиГугл        = "Testing-GoogleWorkspace";
-    
-    Разделы = Новый Структура;
-    Разделы.Вставить("Telegram"       , СтандартныеЗависимости);
-    Разделы.Вставить("VK"             , СтандартныеЗависимости);
-    Разделы.Вставить("Viber"          , СтандартныеЗависимости);
-    Разделы.Вставить("Twitter"        , СтандартныеЗависимости);
-    Разделы.Вставить("YandexDisk"     , СтандартныеЗависимости);
-    Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости);
-    Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл);      
-    Разделы.Вставить("GoogleDrive"    , ЗависимостиГугл);
-    Разделы.Вставить("GoogleSheets"   , ЗависимостиГугл);
-    Разделы.Вставить("Notion"         , СтандартныеЗависимости);
-    Разделы.Вставить("Slack"          , СтандартныеЗависимости);
-    Разделы.Вставить("Airtable"       , СтандартныеЗависимости);
-    Разделы.Вставить("Dropbox"        , СтандартныеЗависимости);
-        
-    Возврат Разделы;
-    
-КонецФункции
-
-Функция ПолучитьТаблицуТестов() Экспорт
-    
-    Телеграм  = "Telegram";
-    ВКонтакте = "VK";
-    ЯДиск     = "YandexDisk";
-    Календарь = "GoogleCalendar";
-    Твиттер   = "Twitter";
-    Вайбер    = "Viber";
-    Драйв     = "GoogleDrive";
-    ВСпейс    = "GoogleWorkspace";
-    Ноушн     = "Notion";
-    Слак      = "Slack";
-    Таблицы   = "GoogleSheets";
-    АирТ      = "Airtable";
-    ДропБокс  = "Dropbox";
-    
-    ТаблицаТестов = Новый ТаблицаЗначений;
-    ТаблицаТестов.Колонки.Добавить("Метод");
-    ТаблицаТестов.Колонки.Добавить("Синоним");
-    ТаблицаТестов.Колонки.Добавить("Раздел");
-                                              
-    НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота"      , "Получить информацию бота"       , Телеграм);     
-    НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления"          , "Получить обновления"            , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook"           , "Установить Webhook"             , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение"  , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку"           , "Отправить картинку"             , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео"              , "Отправить видео"                , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьАудио"              , "Отправить аудио"                , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьДокумент"           , "Отправить документ"             , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьГифку"              , "Отправить гифку"                , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМедиагруппу"        , "Отправить медиагруппу"          , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМестоположение"     , "Отправить местоположение"       , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКонтакт"            , "Отправить контакт"              , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьОпрос"              , "Отправить опрос"                , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ПереслатьСообщение"          , "Переслать сообщение"            , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_БанРазбан"                   , "Бан/Разбан"                     , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_СоздатьСсылкуПриглашение"    , "Создать ссылку-приглашение"     , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение"  , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников"     , "Получить число участников"      , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума"    , "Создать/Удалить тему форума"    , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы"      , "Изменить имя главной темы"      , Телеграм);
-    НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему"   , "Скрыть/Показать главную тему"   , Телеграм);
-    
-    НовыйТест(ТаблицаТестов, "ВК_СоздатьСсылкуТокена"               , "Создать ссылку получения токена", ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_СоздатьУдалитьПост"                , "Создать/Удалить пост"           , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_СоздатьСоставнойПост"              , "Создать/Удалить составной пост" , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_СоздатьОпрос"                      , "Создать опрос"                  , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_СохранитьУдалитьКартинку"          , "Добавить/Удалить картинку"      , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_СоздатьИсторию"                    , "Создать историю"                , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_МетодыОбсуждений"                  , "Действия с обсуждениями"        , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ЛайкРепостКоммент"                 , "Лайк/Репост/Комментарий"        , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистику"                , "Получить статистику"            , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистикуПостов"          , "Получить статистику постов"     , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_СоздатьРекламнуюКампанию"          , "Создать рекламную кампанию"     , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ОтправитьСообщение"                , "Отправить сообщение"            , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ПолучитьКатегорииТоваров"          , "Получить категории товаров"     , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварПодборку"              , "Создать товар и подборку"       , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварСоСвойствами"          , "Создать товар со свойствами"    , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокТоваров"             , "Получить список товаров"        , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокПодборок"            , "Получить список подборок"       , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокСвойств"             , "Получить список свойств"        , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокЗаказов"             , "Получить список заказов"        , ВКонтакте);
-    НовыйТест(ТаблицаТестов, "ВК_ЗагрузитьВидео"                    , "Загрузить видео"                , ВКонтакте);
-    
-    НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьИнформациюОДиске"       , "Получить информацию о диске"    , ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьПапку"                   , "Создать папку"                  , ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект", "Загрузить по URL и получить"    , ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьУдалитьФайл"           , "Загрузить/Удалить файл"         , ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьКопиюОбъекта"            , "Создать копию объекта"          , ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСсылкуНаСкачивание"     , "Получить ссылку на скачивание"  , ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокФайлов"           , "Получить список файлов"         , ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_ПереместитьОбъект"              , "Переместить объект"             , ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_ДействияПубличныхОбъектов"      , "Действия с публичными объектами", ЯДиск);
-    НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокОпубликованных"   , "Получить список опубликованных" , ЯДиск);
-    
-    НовыйТест(ТаблицаТестов, "ГВ_ПолучитьСсылкуАвторизации"         , "Получить ссылку авторизации"    , ВСпейс);
-    НовыйТест(ТаблицаТестов, "ГВ_ПолучитьТокен"                     , "Получить токен"                 , ВСпейс);
-    НовыйТест(ТаблицаТестов, "ГВ_ОбновитьТокен"                     , "Обновить токен"                 , ВСпейс);
-    
-    НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокКалендарей"          , "Получить список календарей"     , Календарь);
-    НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьКалендарь"           , "Создать/Удалить календарь"      , Календарь);
-    НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьСобытие"             , "Создать/Удалить событие"        , Календарь);
-    НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий"             , "Получить список событий"        , Календарь);
-    
-    НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов"           , "Получить список каталогов"      , Драйв);
-    НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл"              , "Загрузить/Удалить Файл"         , Драйв);
-    НовыйТест(ТаблицаТестов, "ГД_СоздатьУдалитьКомментарий"         , "Создать/Удалить кооментарий"    , Драйв);
-    НовыйТест(ТаблицаТестов, "ГД_СоздатьКаталог"                    , "Создать/Удалить каталог"        , Драйв);
-    
-    НовыйТест(ТаблицаТестов, "ГТ_СоздатьТаблицу"                    , "Создать таблицу"                , Таблицы);
-    НовыйТест(ТаблицаТестов, "ГТ_ПолучитьТаблицу"                   , "Получить таблицу"               , Таблицы);
-    НовыйТест(ТаблицаТестов, "ГТ_ЗаполнитьОчиститьЯчейки"           , "Заполнить/Очистить ячейки"      , Таблицы);
-    
-    НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации"    , "Получить ссылку авторизации"    , Твиттер);
-    НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен"                , "Обновить токен"                 , Твиттер);
-    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТекстовыйТвит"         , "Текстовый твит"                 , Твиттер);
-    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСКартинкой"        , "Твит с картинкой"               , Твиттер);
-    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСВидео"            , "Твит с видео"                   , Твиттер);
-    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСГиф"              , "Твит с гиф"                     , Твиттер);
-    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСОпросом"          , "Твит с опросом"                 , Твиттер);
-    
-    НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьИнформациюОКанале"     , "Получить информацию канала"     , Вайбер);
-    НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьДанныеПользователя"    , "Получить данные пользователя"   , Вайбер);
-    НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьОнлайнПользователей"   , "Получить онлайн пользователей"  , Вайбер);
-    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьТекстовоеСообщение"   , "Отправить текстовое сообщение"  , Вайбер);
-    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКартинку"             , "Отправить картинку"             , Вайбер);
-    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьФайл"                 , "Отправить файл"                 , Вайбер);
-    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКонтакт"              , "Отправить контакт"              , Вайбер);
-    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьЛокацию"              , "Отправить локацию"              , Вайбер);
-    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьСсылку"               , "Отправить ссылку"               , Вайбер);
-    
-    НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницу"                , "Создать страницу"               , Ноушн);
-    НовыйТест(ТаблицаТестов, "Ноушн_СоздатьИзменитьБазу"            , "Создать/Изменить базу"          , Ноушн);
-    НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОСтранице"    , "Получить информацию о странице" , Ноушн);
-    НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОБазе"        , "Получить информацию о базе"     , Ноушн);
-    НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницуВБазу"           , "Создать страницу в базу"        , Ноушн);
-    НовыйТест(ТаблицаТестов, "Ноушн_ИзменитьСвойстваСтраницы"       , "Изменить свойства страницы"     , Ноушн);
-    НовыйТест(ТаблицаТестов, "Ноушн_СоздатьУдалитьБлок"             , "Создать/Удалить блок"           , Ноушн);
-    НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей"          , "Получить пользователей"         , Ноушн);
-    НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя"     , "Получить данные пользователя"   , Ноушн);
-    
-    НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте"         , "Получить информацию о боте"     , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокПользователей"     , "Получить список пользователей"  , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей"          , "Получить список областей"       , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение"       , "Отправить/Удалить сообщение"    , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьЭфемерное"       , "Отправить/Удалить эфемерное"    , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ПолучитьОтложенныеСообщения"     , "Получить отложенные сообщения"  , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал"        , "Создать/Архивировать канал"     , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов"           , "Получить список каналов"        , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог"            , "Открыть/Закрыть диалог"         , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов"            , "Получить список файлов"         , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл"            , "Загрузить/Удалить файл"         , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ"                , "Получить список внеш. файлов"   , Слак);
-    НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ"              , "Загрузить/Удалить внеш. файл"   , Слак);
-    
-    НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу"                       , "Создать/Изменить базу"          , АирТ);
-    НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу"                    , "Создать/Изменить таблицу"       , АирТ);
-    НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле"                       , "Создать/Изменить поле"          , АирТ);
-    НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи"              , "Создать/Удалить записи"         , АирТ);
-    
-    НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен"       , "Получить/Обновить токен"        , ДропБокс);
-    НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл"               , "Загрузить файл"                 , ДропБокс);
-    НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайлПоURL"          , "Загрузить файл по URL"          , ДропБокс);
-    НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьКаталог"              , "Создать каталог"                , ДропБокс);
-    НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьУдалитьТег"           , "Создать/Удалить тег"            , ДропБокс);
-    НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьАккаунт"             , "Получить данные аккаунта"       , ДропБокс);
-    НовыйТест(ТаблицаТестов, "ДропБокс_РаботаСДоступами"            , "Работа с доступами"             , ДропБокс);
-   
-    Возврат ТаблицаТестов;
-                                    
-КонецФункции                             
-
-Функция ОжидаетЧто(Значение) Экспорт
-    
-    Попытка
-        
-        Модуль  = ПолучитьОбщийМодуль("ЮТест");
-        Ожидаем = ТипЗнч(Модуль) = Тип("ОбщийМодуль");
-        Возврат Модуль.ОжидаетЧто(Значение);  
-           
-    Исключение
-        Возврат Ожидаем.Что(Значение);
-    КонецПопытки;
-    
-КонецФункции
-
-Функция СформироватьТестыЯкс() Экспорт
-    
-    Модуль        = ПолучитьОбщийМодуль("ЮТТесты");
-    Разделы       = ПолучитьСоответствиеРазделовТестирования();
-    ТаблицаТестов = ПолучитьТаблицуТестов();
-    
-    Для Каждого Раздел Из Разделы Цикл
-        
-        ТекущийРаздел = Раздел.Ключ;
-        Отбор         = Новый Структура("Раздел", ТекущийРаздел);
-        ТестыРаздела  = ТаблицаТестов.НайтиСтроки(Отбор);
-        
-        Набор = Модуль.ДобавитьТестовыйНабор(ТекущийРаздел);
-        
-        Для Каждого Тест Из ТестыРаздела Цикл
-            Набор.ДобавитьСерверныйТест(Тест.Метод, Тест.Синоним);
-        КонецЦикла;
-        
-    КонецЦикла;
-    
-    Возврат "";
-    
-КонецФункции
-
-Функция СформироватьТестыАссертс() Экспорт
-    
-   ТаблицаТестов = ПолучитьТаблицуТестов();
-   МассивТестов  = Новый Массив;
-   
-   Для Каждого Тест Из ТаблицаТестов Цикл     
-       МассивТестов.Добавить(Тест.Метод);
-   КонецЦикла;
-   
-   Возврат МассивТестов;
-   
-КонецФункции
-
-Функция ПолучитьПараметр(Параметр) Экспорт 
-
-    Путь = ПутьКФайлуДанных(); 
-    Возврат ПолучитьЗначениеИзФайла(Параметр, Путь);
-
-КонецФункции
-
-Функция ПолучитьДвоичные(Параметр) Экспорт
-    
-    Путь              = ПутьКФайлуДанных(); 
-    ПараметрЛокальный = Параметр + "Local";
-    ЗначениеОсновной  = ПолучитьЗначениеИзФайла(Параметр         , Путь);
-    ЗначениеЛокальный = ПолучитьЗначениеИзФайла(ПараметрЛокальный, Путь);
-    
-    ФайлЛокальный = Новый Файл(ЗначениеЛокальный);
-    
-    Если ФайлЛокальный.Существует() Тогда
-        Значение = Новый ДвоичныеДанные(ЗначениеЛокальный);
-    Иначе
-        Значение = ЗначениеОсновной;
-    КонецЕсли;
-    
-    Если ТипЗнч(Значение) = Тип("Строка") Тогда
-        Значение = ПолучитьФайлПути(Значение, ПараметрЛокальный);    
-    КонецЕсли;
-    
-    Возврат Значение;
-    
-КонецФункции
-
-Функция ПолучитьФайлПути(Знач Путь, ПараметрЛокальный, Знач СохранятьЛокально = Истина) Экспорт
-    
-    Если СтрНайти(Путь, "http") > 0 
-        Или СтрНайти(Путь, "www") > 0 Тогда
-        
-        ИВФ = ПолучитьИмяВременногоФайла();
-        КопироватьФайл(Путь, ИВФ);
-        Путь = ИВФ;
-        Двоичные = Новый ДвоичныеДанные(Путь);
-        
-        Если СохранятьЛокально Тогда
-            ЗаписатьПараметр(ПараметрЛокальный, ИВФ);
-        Иначе
-            УдалитьФайлы(ИВФ);
-        КонецЕсли;
-        
-    Иначе
-        
-        Двоичные = Новый ДвоичныеДанные(Путь);
-        
-    КонецЕсли;
-    
-    Возврат Двоичные;
-    
-КонецФункции
-
-Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт
-
-	Значение = ПолучитьПараметр(Параметр);
-	Коллекция.Вставить(Параметр, Значение);
-		
-КонецПроцедуры
-
-Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт
-
-	Значение = ПолучитьДвоичные(Параметр);
-	Коллекция.Вставить(Параметр, Значение);
-		
-КонецПроцедуры
-
-Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт
-    
-    Путь = ПутьКФайлуДанных(); 
-    ЗаписатьПараметрВФайл(Параметр, Значение, Путь);
-   
-КонецПроцедуры
-
-Процедура ЗаписатьЛог(Знач Результат, Знач Метод, Знач Библиотека = "") Экспорт
-    
-    Шапка    = Строка(OPI_Инструменты.ПолучитьТекущуюДату()) + " | " + Метод;
-    
-    Попытка
-        Данные = OPI_Инструменты.JSONСтрокой(Результат);
-    Исключение
-        Данные = "Не JSON: " + Строка(Результат);
-    КонецПопытки;
-    
-    Данные   = "    " + Данные; 
-    
-    Сообщить(Шапка);
-    Сообщить(Символы.ПС);
-    Сообщить(Данные);
-    Сообщить(Символы.ПС);
-    Сообщить("---------------------------------");
-    Сообщить(Символы.ПС);
-    
-    Если ЗначениеЗаполнено(Библиотека) Тогда
-		ЗаписатьФайлЛога(Данные, Метод, Библиотека);
-	КонецЕсли;
-	
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьЗначениеИзФайла(Параметр, Путь) 
-        
-    Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);    
-    Возврат ?(Значения.Свойство(Параметр), Значения[Параметр], "");
-    
-КонецФункции
-
-Функция ПутьКФайлуДанных()
-    
-    Путь = "";
-    ВозможныеПути = Новый Массив;
-    ВозможныеПути.Добавить("./data.json");
-    ВозможныеПути.Добавить("C:\GDrive\Мой диск\data.json");
-    ВозможныеПути.Добавить("D:\GD\Мой диск\data.json");
-    
-    Для Каждого ВозможныйПуть Из ВозможныеПути Цикл
-    	
-	    ФайлРепозитория = Новый Файл(ВозможныйПуть);
-	    
-	    Если ФайлРепозитория.Существует() Тогда
-	        Путь = ВозможныйПуть;
-	    КонецЕсли;    
-    
-    КонецЦикла;
-     
-    Возврат Путь;
-    
-КонецФункции
-
-Функция ПолучитьОбщийМодуль(Знач Имя)
-        
-    Модуль  = Вычислить(Имя);     
-        
-    Возврат Модуль;    
-КонецФункции
-
-Процедура НовыйТест(ТаблицаЗначений, Знач Метод, Знач Синоним, Знач Раздел)
-    
-    НовыйТест = ТаблицаЗначений.Добавить();
-    НовыйТест.Метод     = Метод;
-    НовыйТест.Синоним   = Синоним;
-    НовыйТест.Раздел    = Раздел;
-    
-КонецПроцедуры
-
-Процедура ЗаписатьПараметрВФайл(Знач Параметр, Знач Значение, Знач Путь)
-                      
-    Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
-    Значения.Вставить(Параметр, Значение);
-
-    Запись              = Новый ЗаписьJSON;
-    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
-    Запись.ОткрытьФайл(Путь, , , ПараметрыЗаписиJSON);
-    ЗаписатьJSON(Запись, Значения);
-    Запись.Закрыть();
-
-КонецПроцедуры
-
-Процедура ЗаписатьФайлЛога(Знач Данные, Знач Метод, Знач Библиотека)
-	
-	Попытка
-		
-		ПутьЛогов           = "./docs/results";
-		ПутьЛоговБиблиотеки = ПутьЛогов + "/" + Библиотека;
-		
-		КаталогЛогов = Новый Файл(ПутьЛогов);
-		
-		Если Не КаталогЛогов.Существует() Тогда
-			СоздатьКаталог(ПутьЛогов);
-		КонецЕсли;
-		
-		КаталогЛоговБиблиотеки = Новый Файл(ПутьЛоговБиблиотеки);
-        
-        Если Не КаталогЛоговБиблиотеки.Существует() Тогда
-            СоздатьКаталог(ПутьЛоговБиблиотеки);
-        КонецЕсли;
-		 
-		ПутьКФайлу = ПутьЛоговБиблиотеки + "/" + Метод + ".log";
-		ФайлЛога   = Новый Файл(ПутьКФайлу);
-		
-		Если Не ФайлЛога.Существует() Тогда
-			ДокументЛога = Новый ТекстовыйДокумент;
-			ДокументЛога.УстановитьТекст(Данные);
-			ДокументЛога.Записать(ПутьКФайлу);
-		КонецЕсли;
-		
-	Исключение
-		Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());	
-	КонецПопытки;
-	
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UsingHardcodePath-off
+// BSLLS:Typo-off
+// BSLLS:DeprecatedMessage-off
+// BSLLS:UsingServiceTag-off
+// BSLLS:ExecuteExternalCodeInCommonModule-off
+// BSLLS:DuplicateStringLiteral-off
+
+//@skip-check use-non-recommended-method
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "./internal"
+#Использовать asserts
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Функция ПолучитьСоответствиеРазделовТестирования() Экспорт
+    
+    СтандартныеЗависимости = "[Decode, Build]";
+    ЗависимостиГугл        = "Testing-GoogleWorkspace";
+    
+    Разделы = Новый Структура;
+    Разделы.Вставить("Telegram"       , СтандартныеЗависимости);
+    Разделы.Вставить("VK"             , СтандартныеЗависимости);
+    Разделы.Вставить("Viber"          , СтандартныеЗависимости);
+    Разделы.Вставить("Twitter"        , СтандартныеЗависимости);
+    Разделы.Вставить("YandexDisk"     , СтандартныеЗависимости);
+    Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости);
+    Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл);      
+    Разделы.Вставить("GoogleDrive"    , ЗависимостиГугл);
+    Разделы.Вставить("GoogleSheets"   , ЗависимостиГугл);
+    Разделы.Вставить("Notion"         , СтандартныеЗависимости);
+    Разделы.Вставить("Slack"          , СтандартныеЗависимости);
+    Разделы.Вставить("Airtable"       , СтандартныеЗависимости);
+    Разделы.Вставить("Dropbox"        , СтандартныеЗависимости);
+        
+    Возврат Разделы;
+    
+КонецФункции
+
+Функция ПолучитьТаблицуТестов() Экспорт
+    
+    Телеграм  = "Telegram";
+    ВКонтакте = "VK";
+    ЯДиск     = "YandexDisk";
+    Календарь = "GoogleCalendar";
+    Твиттер   = "Twitter";
+    Вайбер    = "Viber";
+    Драйв     = "GoogleDrive";
+    ВСпейс    = "GoogleWorkspace";
+    Ноушн     = "Notion";
+    Слак      = "Slack";
+    Таблицы   = "GoogleSheets";
+    АирТ      = "Airtable";
+    ДропБокс  = "Dropbox";
+    
+    ТаблицаТестов = Новый ТаблицаЗначений;
+    ТаблицаТестов.Колонки.Добавить("Метод");
+    ТаблицаТестов.Колонки.Добавить("Синоним");
+    ТаблицаТестов.Колонки.Добавить("Раздел");
+                                              
+    НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота"      , "Получить информацию бота"       , Телеграм);     
+    НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления"          , "Получить обновления"            , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook"           , "Установить Webhook"             , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение"  , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку"           , "Отправить картинку"             , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео"              , "Отправить видео"                , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьАудио"              , "Отправить аудио"                , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьДокумент"           , "Отправить документ"             , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьГифку"              , "Отправить гифку"                , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМедиагруппу"        , "Отправить медиагруппу"          , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМестоположение"     , "Отправить местоположение"       , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКонтакт"            , "Отправить контакт"              , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьОпрос"              , "Отправить опрос"                , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ПереслатьСообщение"          , "Переслать сообщение"            , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_БанРазбан"                   , "Бан/Разбан"                     , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_СоздатьСсылкуПриглашение"    , "Создать ссылку-приглашение"     , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение"  , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников"     , "Получить число участников"      , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума"    , "Создать/Удалить тему форума"    , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы"      , "Изменить имя главной темы"      , Телеграм);
+    НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему"   , "Скрыть/Показать главную тему"   , Телеграм);
+    
+    НовыйТест(ТаблицаТестов, "ВК_СоздатьСсылкуТокена"               , "Создать ссылку получения токена", ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_СоздатьУдалитьПост"                , "Создать/Удалить пост"           , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_СоздатьСоставнойПост"              , "Создать/Удалить составной пост" , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_СоздатьОпрос"                      , "Создать опрос"                  , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_СохранитьУдалитьКартинку"          , "Добавить/Удалить картинку"      , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_СоздатьИсторию"                    , "Создать историю"                , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_МетодыОбсуждений"                  , "Действия с обсуждениями"        , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ЛайкРепостКоммент"                 , "Лайк/Репост/Комментарий"        , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистику"                , "Получить статистику"            , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистикуПостов"          , "Получить статистику постов"     , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_СоздатьРекламнуюКампанию"          , "Создать рекламную кампанию"     , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ОтправитьСообщение"                , "Отправить сообщение"            , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ПолучитьКатегорииТоваров"          , "Получить категории товаров"     , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварПодборку"              , "Создать товар и подборку"       , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварСоСвойствами"          , "Создать товар со свойствами"    , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокТоваров"             , "Получить список товаров"        , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокПодборок"            , "Получить список подборок"       , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокСвойств"             , "Получить список свойств"        , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокЗаказов"             , "Получить список заказов"        , ВКонтакте);
+    НовыйТест(ТаблицаТестов, "ВК_ЗагрузитьВидео"                    , "Загрузить видео"                , ВКонтакте);
+    
+    НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьИнформациюОДиске"       , "Получить информацию о диске"    , ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьПапку"                   , "Создать папку"                  , ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект", "Загрузить по URL и получить"    , ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьУдалитьФайл"           , "Загрузить/Удалить файл"         , ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьКопиюОбъекта"            , "Создать копию объекта"          , ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСсылкуНаСкачивание"     , "Получить ссылку на скачивание"  , ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокФайлов"           , "Получить список файлов"         , ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_ПереместитьОбъект"              , "Переместить объект"             , ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_ДействияПубличныхОбъектов"      , "Действия с публичными объектами", ЯДиск);
+    НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокОпубликованных"   , "Получить список опубликованных" , ЯДиск);
+    
+    НовыйТест(ТаблицаТестов, "ГВ_ПолучитьСсылкуАвторизации"         , "Получить ссылку авторизации"    , ВСпейс);
+    НовыйТест(ТаблицаТестов, "ГВ_ПолучитьТокен"                     , "Получить токен"                 , ВСпейс);
+    НовыйТест(ТаблицаТестов, "ГВ_ОбновитьТокен"                     , "Обновить токен"                 , ВСпейс);
+    
+    НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокКалендарей"          , "Получить список календарей"     , Календарь);
+    НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьКалендарь"           , "Создать/Удалить календарь"      , Календарь);
+    НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьСобытие"             , "Создать/Удалить событие"        , Календарь);
+    НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий"             , "Получить список событий"        , Календарь);
+    
+    НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов"           , "Получить список каталогов"      , Драйв);
+    НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл"              , "Загрузить/Удалить Файл"         , Драйв);
+    НовыйТест(ТаблицаТестов, "ГД_СоздатьУдалитьКомментарий"         , "Создать/Удалить кооментарий"    , Драйв);
+    НовыйТест(ТаблицаТестов, "ГД_СоздатьКаталог"                    , "Создать/Удалить каталог"        , Драйв);
+    
+    НовыйТест(ТаблицаТестов, "ГТ_СоздатьТаблицу"                    , "Создать таблицу"                , Таблицы);
+    НовыйТест(ТаблицаТестов, "ГТ_ПолучитьТаблицу"                   , "Получить таблицу"               , Таблицы);
+    НовыйТест(ТаблицаТестов, "ГТ_ЗаполнитьОчиститьЯчейки"           , "Заполнить/Очистить ячейки"      , Таблицы);
+    
+    НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации"    , "Получить ссылку авторизации"    , Твиттер);
+    НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен"                , "Обновить токен"                 , Твиттер);
+    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТекстовыйТвит"         , "Текстовый твит"                 , Твиттер);
+    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСКартинкой"        , "Твит с картинкой"               , Твиттер);
+    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСВидео"            , "Твит с видео"                   , Твиттер);
+    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСГиф"              , "Твит с гиф"                     , Твиттер);
+    НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСОпросом"          , "Твит с опросом"                 , Твиттер);
+    
+    НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьИнформациюОКанале"     , "Получить информацию канала"     , Вайбер);
+    НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьДанныеПользователя"    , "Получить данные пользователя"   , Вайбер);
+    НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьОнлайнПользователей"   , "Получить онлайн пользователей"  , Вайбер);
+    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьТекстовоеСообщение"   , "Отправить текстовое сообщение"  , Вайбер);
+    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКартинку"             , "Отправить картинку"             , Вайбер);
+    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьФайл"                 , "Отправить файл"                 , Вайбер);
+    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКонтакт"              , "Отправить контакт"              , Вайбер);
+    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьЛокацию"              , "Отправить локацию"              , Вайбер);
+    НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьСсылку"               , "Отправить ссылку"               , Вайбер);
+    
+    НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницу"                , "Создать страницу"               , Ноушн);
+    НовыйТест(ТаблицаТестов, "Ноушн_СоздатьИзменитьБазу"            , "Создать/Изменить базу"          , Ноушн);
+    НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОСтранице"    , "Получить информацию о странице" , Ноушн);
+    НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОБазе"        , "Получить информацию о базе"     , Ноушн);
+    НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницуВБазу"           , "Создать страницу в базу"        , Ноушн);
+    НовыйТест(ТаблицаТестов, "Ноушн_ИзменитьСвойстваСтраницы"       , "Изменить свойства страницы"     , Ноушн);
+    НовыйТест(ТаблицаТестов, "Ноушн_СоздатьУдалитьБлок"             , "Создать/Удалить блок"           , Ноушн);
+    НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей"          , "Получить пользователей"         , Ноушн);
+    НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя"     , "Получить данные пользователя"   , Ноушн);
+    
+    НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте"         , "Получить информацию о боте"     , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокПользователей"     , "Получить список пользователей"  , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей"          , "Получить список областей"       , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение"       , "Отправить/Удалить сообщение"    , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьЭфемерное"       , "Отправить/Удалить эфемерное"    , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ПолучитьОтложенныеСообщения"     , "Получить отложенные сообщения"  , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал"        , "Создать/Архивировать канал"     , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов"           , "Получить список каналов"        , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог"            , "Открыть/Закрыть диалог"         , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов"            , "Получить список файлов"         , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл"            , "Загрузить/Удалить файл"         , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ"                , "Получить список внеш. файлов"   , Слак);
+    НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ"              , "Загрузить/Удалить внеш. файл"   , Слак);
+    
+    НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу"                       , "Создать/Изменить базу"          , АирТ);
+    НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу"                    , "Создать/Изменить таблицу"       , АирТ);
+    НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле"                       , "Создать/Изменить поле"          , АирТ);
+    НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи"              , "Создать/Удалить записи"         , АирТ);
+    
+    НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен"       , "Получить/Обновить токен"        , ДропБокс);
+    НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл"               , "Загрузить файл"                 , ДропБокс);
+    НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайлПоURL"          , "Загрузить файл по URL"          , ДропБокс);
+    НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьКаталог"              , "Создать каталог"                , ДропБокс);
+    НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьУдалитьТег"           , "Создать/Удалить тег"            , ДропБокс);
+    НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьАккаунт"             , "Получить данные аккаунта"       , ДропБокс);
+    НовыйТест(ТаблицаТестов, "ДропБокс_РаботаСДоступами"            , "Работа с доступами"             , ДропБокс);
+   
+    Возврат ТаблицаТестов;
+                                    
+КонецФункции                             
+
+Функция ОжидаетЧто(Значение) Экспорт
+    
+    Попытка
+        
+        Модуль  = ПолучитьОбщийМодуль("ЮТест");
+        Ожидаем = ТипЗнч(Модуль) = Тип("ОбщийМодуль");
+        Возврат Модуль.ОжидаетЧто(Значение);  
+           
+    Исключение
+        Возврат Ожидаем.Что(Значение);
+    КонецПопытки;
+    
+КонецФункции
+
+Функция СформироватьТестыЯкс() Экспорт
+    
+    Модуль        = ПолучитьОбщийМодуль("ЮТТесты");
+    Разделы       = ПолучитьСоответствиеРазделовТестирования();
+    ТаблицаТестов = ПолучитьТаблицуТестов();
+    
+    Для Каждого Раздел Из Разделы Цикл
+        
+        ТекущийРаздел = Раздел.Ключ;
+        Отбор         = Новый Структура("Раздел", ТекущийРаздел);
+        ТестыРаздела  = ТаблицаТестов.НайтиСтроки(Отбор);
+        
+        Набор = Модуль.ДобавитьТестовыйНабор(ТекущийРаздел);
+        
+        Для Каждого Тест Из ТестыРаздела Цикл
+            Набор.ДобавитьСерверныйТест(Тест.Метод, Тест.Синоним);
+        КонецЦикла;
+        
+    КонецЦикла;
+    
+    Возврат "";
+    
+КонецФункции
+
+Функция СформироватьТестыАссертс() Экспорт
+    
+   ТаблицаТестов = ПолучитьТаблицуТестов();
+   МассивТестов  = Новый Массив;
+   
+   Для Каждого Тест Из ТаблицаТестов Цикл     
+       МассивТестов.Добавить(Тест.Метод);
+   КонецЦикла;
+   
+   Возврат МассивТестов;
+   
+КонецФункции
+
+Функция ПолучитьПараметр(Параметр) Экспорт 
+
+    Путь = ПутьКФайлуДанных(); 
+    Возврат ПолучитьЗначениеИзФайла(Параметр, Путь);
+
+КонецФункции
+
+Функция ПолучитьДвоичные(Параметр) Экспорт
+    
+    Путь              = ПутьКФайлуДанных(); 
+    ПараметрЛокальный = Параметр + "Local";
+    ЗначениеОсновной  = ПолучитьЗначениеИзФайла(Параметр         , Путь);
+    ЗначениеЛокальный = ПолучитьЗначениеИзФайла(ПараметрЛокальный, Путь);
+    
+    ФайлЛокальный = Новый Файл(ЗначениеЛокальный);
+    
+    Если ФайлЛокальный.Существует() Тогда
+        Значение = Новый ДвоичныеДанные(ЗначениеЛокальный);
+    Иначе
+        Значение = ЗначениеОсновной;
+    КонецЕсли;
+    
+    Если ТипЗнч(Значение) = Тип("Строка") Тогда
+        Значение = ПолучитьФайлПути(Значение, ПараметрЛокальный);    
+    КонецЕсли;
+    
+    Возврат Значение;
+    
+КонецФункции
+
+Функция ПолучитьФайлПути(Знач Путь, ПараметрЛокальный, Знач СохранятьЛокально = Истина) Экспорт
+    
+    Если СтрНайти(Путь, "http") > 0 
+        Или СтрНайти(Путь, "www") > 0 Тогда
+        
+        ИВФ = ПолучитьИмяВременногоФайла();
+        КопироватьФайл(Путь, ИВФ);
+        Путь = ИВФ;
+        Двоичные = Новый ДвоичныеДанные(Путь);
+        
+        Если СохранятьЛокально Тогда
+            ЗаписатьПараметр(ПараметрЛокальный, ИВФ);
+        Иначе
+            УдалитьФайлы(ИВФ);
+        КонецЕсли;
+        
+    Иначе
+        
+        Двоичные = Новый ДвоичныеДанные(Путь);
+        
+    КонецЕсли;
+    
+    Возврат Двоичные;
+    
+КонецФункции
+
+Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт
+
+	Значение = ПолучитьПараметр(Параметр);
+	Коллекция.Вставить(Параметр, Значение);
+		
+КонецПроцедуры
+
+Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт
+
+	Значение = ПолучитьДвоичные(Параметр);
+	Коллекция.Вставить(Параметр, Значение);
+		
+КонецПроцедуры
+
+Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт
+    
+    Путь = ПутьКФайлуДанных(); 
+    ЗаписатьПараметрВФайл(Параметр, Значение, Путь);
+   
+КонецПроцедуры
+
+Процедура ЗаписатьЛог(Знач Результат, Знач Метод, Знач Библиотека = "") Экспорт
+    
+    Шапка    = Строка(OPI_Инструменты.ПолучитьТекущуюДату()) + " | " + Метод;
+    
+    Попытка
+        Данные = OPI_Инструменты.JSONСтрокой(Результат);
+    Исключение
+        Данные = "Не JSON: " + Строка(Результат);
+    КонецПопытки;
+    
+    Данные   = "    " + Данные; 
+    
+    Сообщить(Шапка);
+    Сообщить(Символы.ПС);
+    Сообщить(Данные);
+    Сообщить(Символы.ПС);
+    Сообщить("---------------------------------");
+    Сообщить(Символы.ПС);
+    
+    Если ЗначениеЗаполнено(Библиотека) Тогда
+		ЗаписатьФайлЛога(Данные, Метод, Библиотека);
+	КонецЕсли;
+	
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьЗначениеИзФайла(Параметр, Путь) 
+        
+    Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);    
+    Возврат ?(Значения.Свойство(Параметр), Значения[Параметр], "");
+    
+КонецФункции
+
+Функция ПутьКФайлуДанных()
+    
+    Путь = "";
+    ВозможныеПути = Новый Массив;
+    ВозможныеПути.Добавить("./data.json");
+    ВозможныеПути.Добавить("C:\GDrive\Мой диск\data.json");
+    ВозможныеПути.Добавить("D:\GD\Мой диск\data.json");
+    
+    Для Каждого ВозможныйПуть Из ВозможныеПути Цикл
+    	
+	    ФайлРепозитория = Новый Файл(ВозможныйПуть);
+	    
+	    Если ФайлРепозитория.Существует() Тогда
+	        Путь = ВозможныйПуть;
+	    КонецЕсли;    
+    
+    КонецЦикла;
+     
+    Возврат Путь;
+    
+КонецФункции
+
+Функция ПолучитьОбщийМодуль(Знач Имя)
+        
+    Модуль  = Вычислить(Имя);     
+        
+    Возврат Модуль;    
+КонецФункции
+
+Процедура НовыйТест(ТаблицаЗначений, Знач Метод, Знач Синоним, Знач Раздел)
+    
+    НовыйТест = ТаблицаЗначений.Добавить();
+    НовыйТест.Метод     = Метод;
+    НовыйТест.Синоним   = Синоним;
+    НовыйТест.Раздел    = Раздел;
+    
+КонецПроцедуры
+
+Процедура ЗаписатьПараметрВФайл(Знач Параметр, Знач Значение, Знач Путь)
+                      
+    Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
+    Значения.Вставить(Параметр, Значение);
+
+    Запись              = Новый ЗаписьJSON;
+    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
+    Запись.ОткрытьФайл(Путь, , , ПараметрыЗаписиJSON);
+    ЗаписатьJSON(Запись, Значения);
+    Запись.Закрыть();
+
+КонецПроцедуры
+
+Процедура ЗаписатьФайлЛога(Знач Данные, Знач Метод, Знач Библиотека)
+	
+	Попытка
+		
+		ПутьЛогов           = "./docs/results";
+		ПутьЛоговБиблиотеки = ПутьЛогов + "/" + Библиотека;
+		
+		КаталогЛогов = Новый Файл(ПутьЛогов);
+		
+		Если Не КаталогЛогов.Существует() Тогда
+			СоздатьКаталог(ПутьЛогов);
+		КонецЕсли;
+		
+		КаталогЛоговБиблиотеки = Новый Файл(ПутьЛоговБиблиотеки);
+        
+        Если Не КаталогЛоговБиблиотеки.Существует() Тогда
+            СоздатьКаталог(ПутьЛоговБиблиотеки);
+        КонецЕсли;
+		 
+		ПутьКФайлу = ПутьЛоговБиблиотеки + "/" + Метод + ".log";
+		ФайлЛога   = Новый Файл(ПутьКФайлу);
+		
+		Если Не ФайлЛога.Существует() Тогда
+			ДокументЛога = Новый ТекстовыйДокумент;
+			ДокументЛога.УстановитьТекст(Данные);
+			ДокументЛога.Записать(ПутьКФайлу);
+		КонецЕсли;
+		
+	Исключение
+		Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());	
+	КонецПопытки;
+	
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os b/src/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os
similarity index 97%
rename from ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os
rename to src/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os
index 65f918be99..b1917ae7af 100644
--- a/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os
+++ b/src/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os
@@ -1,320 +1,320 @@
-// Расположение OS: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UnusedLocalVariable-off
-
-#Использовать "./internal"
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-Процедура ПолучитьДвоичныеДанные(Значение) Экспорт
-    
-    Если Значение = Неопределено Тогда
-        Возврат;
-    КонецЕсли;
-    
-    Попытка 
-        
-        Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
-            Возврат;
-        Иначе
-            
-            Файл = Новый Файл(Значение);
-            
-            Если Файл.Существует() Тогда
-                Значение = Новый ДвоичныеДанные(Значение);
-                
-            ИначеЕсли СтрНайти(Значение, "//") Тогда
-                                
-                Значение = OPI_Инструменты.Get(Значение);
-                
-            Иначе
-                
-                Значение = Base64Значение(Значение);
-                
-            КонецЕсли;
-                  
-        КонецЕсли;
-    
-    Исключение
-        ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки();
-    КонецПопытки;
-    
-КонецПроцедуры
-
-Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт
-    
-    Если Значение = Неопределено Тогда
-        Возврат;
-    КонецЕсли;
-    
-    Если ТипЗнч(Значение) <> Тип("Строка") Тогда
-        ПолучитьДвоичныеДанные(Значение);
-        Возврат;
-    КонецЕсли;
-    
-    Файл = Новый Файл(Значение);
-    
-    Если Файл.Существует() Тогда
-        Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть);     
-    Иначе
-        ПолучитьДвоичныеДанные(Значение);
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Процедура ПолучитьКоллекцию(Значение) Экспорт
-    
-    Если Значение = Неопределено Тогда
-        Возврат;
-    КонецЕсли;
-    
-    Попытка 
-        
-        ИсходноеЗначение = Значение;
-        
-        Если ЭтоКоллекция(Значение) Тогда
-            Возврат;
-        Иначе
-            
-            Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
-                Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
-            Иначе
-                Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
-            КонецЕсли;
-            
-            Файл        = Новый Файл(Значение);
-            ЧтениеJSON  = Новый ЧтениеJSON;
-            
-            Если Файл.Существует() Тогда
-                
-                ЧтениеJSON.ОткрытьФайл(Значение);
-                
-           ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
-                
-                ИВФ = ПолучитьИмяВременногоФайла();
-                КопироватьФайл(Значение, ИВФ);
-                ЧтениеJSON.ОткрытьФайл(ИВФ);
-                ЧтениеJSON.Прочитать();
-                
-                УдалитьФайлы(ИВФ);
-                
-            Иначе
-                
-                ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение));
-                
-            КонецЕсли;
-            
-            Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
-            ЧтениеJSON.Закрыть();
-            
-            Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда
-                
-                Значение = ИсходноеЗначение;
-                ПолучитьМассив(Значение);
-                
-            КонецЕсли;
-             
-        КонецЕсли;
-    
-    Исключение
-        
-        Значение = ИсходноеЗначение;
-    	ПолучитьМассив(Значение);	
-        
-    КонецПопытки;
-        
-КонецПроцедуры
-
-Процедура ПолучитьМассив(Значение) Экспорт
-    
-    Если ТипЗнч(Значение) = Тип("Массив") Тогда
-        Возврат;
-    КонецЕсли;
-    
-    Если ТипЗнч(Значение) = Тип("Строка") 
-        И СтрНачинаетсяС(Значение, "[")
-        И СтрЗаканчиваетсяНа(Значение, "]") Тогда
-        	
-        ЗапятаяВКавычках = "','";
-    
-	    Значение = СтрЗаменить(Значение, "['"   , "");
-	    Значение = СтрЗаменить(Значение, "']"   , "");
-	    Значение = СтрЗаменить(Значение, "', '" , ЗапятаяВКавычках);
-	    Значение = СтрЗаменить(Значение, "' , '", ЗапятаяВКавычках);
-	    Значение = СтрЗаменить(Значение, "' ,'" , ЗапятаяВКавычках);
-	
-	    Значение = СтрРазделить(Значение, ЗапятаяВКавычках, Ложь);
-	
-	    Для Н = 0 По Значение.ВГраница() Цикл
-	        Значение[Н] = СокрЛП(Значение[Н]);
-	    КонецЦикла;
-    
-    Иначе
-    	
-        Если ТипЗнч(Значение) = Тип("Число") Тогда
-            Значение = OPI_Инструменты.ЧислоВСтроку(Значение);    
-        КонецЕсли;
-        
-	    OPI_Инструменты.ЗначениеВМассив(Значение);
-	    
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Процедура ПолучитьБулево(Значение) Экспорт
-    
-    Если Значение = Неопределено Тогда
-        Возврат;
-    КонецЕсли;
-    
-    Попытка 
-        
-        Если ТипЗнч(Значение) = Тип("Булево") Тогда
-            Возврат;
-        Иначе
-            Значение = Булево(Значение);
-        КонецЕсли;
-    
-    Исключение
-        ВызватьИсключение "Ошибка получения данных булево из параметра";
-    КонецПопытки;
-        
-КонецПроцедуры
-
-Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт
-    
-    Если Значение = Неопределено Тогда
-        Возврат;
-    КонецЕсли;
-    
-    Попытка 
-        
-        Если ЭтоСимвольное(Значение) Тогда
-                
-            Если Не ИзИсточника Тогда
-                Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
-                Возврат;    
-            КонецЕсли;
-              
-            Значение = OPI_Инструменты.ЧислоВСтроку(Значение);  
-            Файл     = Новый Файл(Значение);
-            
-            Если Файл.Существует() Тогда
-                
-                ЧтениеТекста = Новый ЧтениеТекста(Значение);
-                Значение     = ЧтениеТекста.Прочитать();
-                ЧтениеТекста.Закрыть();
-                
-            ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
-                
-                ИВФ = ПолучитьИмяВременногоФайла();
-                КопироватьФайл(Значение, ИВФ);
-                
-                ЧтениеТекста = Новый ЧтениеТекста(ИВФ);
-                Значение     = ЧтениеТекста.Прочитать();
-                ЧтениеТекста.Закрыть();
-                
-                УдалитьФайлы(ИВФ);
-                
-            Иначе
-                
-                Возврат;
-                
-            КонецЕсли;
-            
-        ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
-            
-            Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
-            
-        ИначеЕсли ЭтоКоллекция(Значение) Тогда
-                
-            Значение = OPI_Инструменты.JSONСтрокой(Значение); 
-            
-        Иначе
-            Возврат;
-        КонецЕсли;
-                  
-    Исключение
-        Значение = Строка(Значение);
-        Возврат;
-    КонецПопытки;
-    
-КонецПроцедуры
-
-Процедура ПолучитьДату(Значение) Экспорт
-    
-    Если Значение = Неопределено Тогда
-        Возврат;
-    КонецЕсли;
-    
-    Дата = "Дата";
-    
-    Попытка 
-        
-        Если ТипЗнч(Значение) = Тип(Дата) Тогда
-            Возврат;
-        Иначе         
-            Значение = XMLЗначение(Тип(Дата), Значение);                   
-        КонецЕсли;
-    
-    Исключение
-        ООД = Новый ОписаниеТипов(Дата);
-        Значение = ООД.ПривестиЗначение(Значение);
-    КонецПопытки;
-        
-КонецПроцедуры
-
-Процедура ПолучитьЧисло(Значение) Экспорт
-    
-    ОписаниеТипа = Новый ОписаниеТипов("Число");
-    Значение = ОписаниеТипа.ПривестиЗначение(Значение);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ЭтоКоллекция(Знач Значение)
-	
-	Возврат ТипЗнч(Значение) = Тип("Массив")
-            Или ТипЗнч(Значение) = Тип("Структура")
-            Или ТипЗнч(Значение) = Тип("Соответствие");
-            
-КонецФункции      
-
-Функция ЭтоСимвольное(Знач Значение)
-	
-	Возврат ТипЗнч(Значение) = Тип("Строка")
-            Или ТипЗнч(Значение) = Тип("Число") 
-            Или ТипЗнч(Значение) = Тип("Дата");
-            
-КонецФункции      
-
-#КонецОбласти
+// Расположение OS: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UnusedLocalVariable-off
+
+#Использовать "./internal"
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Процедура ПолучитьДвоичныеДанные(Значение) Экспорт
+    
+    Если Значение = Неопределено Тогда
+        Возврат;
+    КонецЕсли;
+    
+    Попытка 
+        
+        Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
+            Возврат;
+        Иначе
+            
+            Файл = Новый Файл(Значение);
+            
+            Если Файл.Существует() Тогда
+                Значение = Новый ДвоичныеДанные(Значение);
+                
+            ИначеЕсли СтрНайти(Значение, "//") Тогда
+                                
+                Значение = OPI_Инструменты.Get(Значение);
+                
+            Иначе
+                
+                Значение = Base64Значение(Значение);
+                
+            КонецЕсли;
+                  
+        КонецЕсли;
+    
+    Исключение
+        ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки();
+    КонецПопытки;
+    
+КонецПроцедуры
+
+Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт
+    
+    Если Значение = Неопределено Тогда
+        Возврат;
+    КонецЕсли;
+    
+    Если ТипЗнч(Значение) <> Тип("Строка") Тогда
+        ПолучитьДвоичныеДанные(Значение);
+        Возврат;
+    КонецЕсли;
+    
+    Файл = Новый Файл(Значение);
+    
+    Если Файл.Существует() Тогда
+        Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть);     
+    Иначе
+        ПолучитьДвоичныеДанные(Значение);
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Процедура ПолучитьКоллекцию(Значение) Экспорт
+    
+    Если Значение = Неопределено Тогда
+        Возврат;
+    КонецЕсли;
+    
+    Попытка 
+        
+        ИсходноеЗначение = Значение;
+        
+        Если ЭтоКоллекция(Значение) Тогда
+            Возврат;
+        Иначе
+            
+            Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
+                Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
+            Иначе
+                Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
+            КонецЕсли;
+            
+            Файл        = Новый Файл(Значение);
+            ЧтениеJSON  = Новый ЧтениеJSON;
+            
+            Если Файл.Существует() Тогда
+                
+                ЧтениеJSON.ОткрытьФайл(Значение);
+                
+           ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
+                
+                ИВФ = ПолучитьИмяВременногоФайла();
+                КопироватьФайл(Значение, ИВФ);
+                ЧтениеJSON.ОткрытьФайл(ИВФ);
+                ЧтениеJSON.Прочитать();
+                
+                УдалитьФайлы(ИВФ);
+                
+            Иначе
+                
+                ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение));
+                
+            КонецЕсли;
+            
+            Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
+            ЧтениеJSON.Закрыть();
+            
+            Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда
+                
+                Значение = ИсходноеЗначение;
+                ПолучитьМассив(Значение);
+                
+            КонецЕсли;
+             
+        КонецЕсли;
+    
+    Исключение
+        
+        Значение = ИсходноеЗначение;
+    	ПолучитьМассив(Значение);	
+        
+    КонецПопытки;
+        
+КонецПроцедуры
+
+Процедура ПолучитьМассив(Значение) Экспорт
+    
+    Если ТипЗнч(Значение) = Тип("Массив") Тогда
+        Возврат;
+    КонецЕсли;
+    
+    Если ТипЗнч(Значение) = Тип("Строка") 
+        И СтрНачинаетсяС(Значение, "[")
+        И СтрЗаканчиваетсяНа(Значение, "]") Тогда
+        	
+        ЗапятаяВКавычках = "','";
+    
+	    Значение = СтрЗаменить(Значение, "['"   , "");
+	    Значение = СтрЗаменить(Значение, "']"   , "");
+	    Значение = СтрЗаменить(Значение, "', '" , ЗапятаяВКавычках);
+	    Значение = СтрЗаменить(Значение, "' , '", ЗапятаяВКавычках);
+	    Значение = СтрЗаменить(Значение, "' ,'" , ЗапятаяВКавычках);
+	
+	    Значение = СтрРазделить(Значение, ЗапятаяВКавычках, Ложь);
+	
+	    Для Н = 0 По Значение.ВГраница() Цикл
+	        Значение[Н] = СокрЛП(Значение[Н]);
+	    КонецЦикла;
+    
+    Иначе
+    	
+        Если ТипЗнч(Значение) = Тип("Число") Тогда
+            Значение = OPI_Инструменты.ЧислоВСтроку(Значение);    
+        КонецЕсли;
+        
+	    OPI_Инструменты.ЗначениеВМассив(Значение);
+	    
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Процедура ПолучитьБулево(Значение) Экспорт
+    
+    Если Значение = Неопределено Тогда
+        Возврат;
+    КонецЕсли;
+    
+    Попытка 
+        
+        Если ТипЗнч(Значение) = Тип("Булево") Тогда
+            Возврат;
+        Иначе
+            Значение = Булево(Значение);
+        КонецЕсли;
+    
+    Исключение
+        ВызватьИсключение "Ошибка получения данных булево из параметра";
+    КонецПопытки;
+        
+КонецПроцедуры
+
+Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт
+    
+    Если Значение = Неопределено Тогда
+        Возврат;
+    КонецЕсли;
+    
+    Попытка 
+        
+        Если ЭтоСимвольное(Значение) Тогда
+                
+            Если Не ИзИсточника Тогда
+                Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
+                Возврат;    
+            КонецЕсли;
+              
+            Значение = OPI_Инструменты.ЧислоВСтроку(Значение);  
+            Файл     = Новый Файл(Значение);
+            
+            Если Файл.Существует() Тогда
+                
+                ЧтениеТекста = Новый ЧтениеТекста(Значение);
+                Значение     = ЧтениеТекста.Прочитать();
+                ЧтениеТекста.Закрыть();
+                
+            ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
+                
+                ИВФ = ПолучитьИмяВременногоФайла();
+                КопироватьФайл(Значение, ИВФ);
+                
+                ЧтениеТекста = Новый ЧтениеТекста(ИВФ);
+                Значение     = ЧтениеТекста.Прочитать();
+                ЧтениеТекста.Закрыть();
+                
+                УдалитьФайлы(ИВФ);
+                
+            Иначе
+                
+                Возврат;
+                
+            КонецЕсли;
+            
+        ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
+            
+            Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
+            
+        ИначеЕсли ЭтоКоллекция(Значение) Тогда
+                
+            Значение = OPI_Инструменты.JSONСтрокой(Значение); 
+            
+        Иначе
+            Возврат;
+        КонецЕсли;
+                  
+    Исключение
+        Значение = Строка(Значение);
+        Возврат;
+    КонецПопытки;
+    
+КонецПроцедуры
+
+Процедура ПолучитьДату(Значение) Экспорт
+    
+    Если Значение = Неопределено Тогда
+        Возврат;
+    КонецЕсли;
+    
+    Дата = "Дата";
+    
+    Попытка 
+        
+        Если ТипЗнч(Значение) = Тип(Дата) Тогда
+            Возврат;
+        Иначе         
+            Значение = XMLЗначение(Тип(Дата), Значение);                   
+        КонецЕсли;
+    
+    Исключение
+        ООД = Новый ОписаниеТипов(Дата);
+        Значение = ООД.ПривестиЗначение(Значение);
+    КонецПопытки;
+        
+КонецПроцедуры
+
+Процедура ПолучитьЧисло(Значение) Экспорт
+    
+    ОписаниеТипа = Новый ОписаниеТипов("Число");
+    Значение = ОписаниеТипа.ПривестиЗначение(Значение);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ЭтоКоллекция(Знач Значение)
+	
+	Возврат ТипЗнч(Значение) = Тип("Массив")
+            Или ТипЗнч(Значение) = Тип("Структура")
+            Или ТипЗнч(Значение) = Тип("Соответствие");
+            
+КонецФункции      
+
+Функция ЭтоСимвольное(Знач Значение)
+	
+	Возврат ТипЗнч(Значение) = Тип("Строка")
+            Или ТипЗнч(Значение) = Тип("Число") 
+            Или ТипЗнч(Значение) = Тип("Дата");
+            
+КонецФункции      
+
+#КонецОбласти
diff --git a/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os b/src/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
similarity index 97%
rename from ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
rename to src/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
index bc48b37707..541ea150b9 100644
--- a/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
+++ b/src/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
@@ -1,1229 +1,1229 @@
-// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:Typo-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UnusedLocalVariable-off
-// BSLLS:UsingServiceTag-off
-// BSLLS:NumberOfOptionalParams-off
-
-//@skip-check module-unused-local-variable
-//@skip-check method-too-many-params
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-#Область HTTPМетоды
-
-#Область ЗапросыБезТела
-
-Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт
-    Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета);
-КонецФункции
-
-Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт
-    Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета);
-КонецФункции
-
-#КонецОбласти
-
-#Область ЗапросыСТелом
-
-Функция Post(Знач URL
-    , Знач Параметры = ""
-    , Знач ДопЗаголовки = ""
-    , Знач JSON = Истина
-    , Знач ПолныйОтвет = Ложь
-    , Знач ФайлОтвета = Неопределено) Экспорт
-    
-    Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
-    
-КонецФункции
-
-Функция Patch(Знач URL
-    , Знач Параметры = ""
-    , Знач ДопЗаголовки = ""
-    , Знач JSON = Истина
-    , Знач ПолныйОтвет = Ложь
-    , Знач ФайлОтвета = Неопределено) Экспорт
-    
-    Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
-    
-КонецФункции
-
-Функция Put(Знач URL
-    , Знач Параметры = ""
-    , Знач ДопЗаголовки = ""
-    , Знач JSON = Истина
-    , Знач ПолныйОтвет = Ложь
-    , Знач ФайлОтвета = Неопределено) Экспорт
-    
-    Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
-    
-КонецФункции
-
-Функция PostBinary(Знач URL
-    , Знач Тело
-    , Знач ДопЗаголовки
-    , Знач ПолныйОтвет = Ложь
-    , Знач ТипДанных = "application/octet-stream") Экспорт
-    
-    Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет, ТипДанных);
-    
-КонецФункции
-
-#КонецОбласти 
-
-#Область ЗапросыMultipart
-
-Функция PostMultipart(Знач URL
-    , Знач Параметры = ""
-    , Знач Файлы = ""
-    , Знач ТипКонтента = "image/jpeg"
-    , Знач ДопЗаголовки = ""
-    , Знач ФайлОтвета = Неопределено) Экспорт
-
-    Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
-
-КонецФункции
-
-Функция PutMultipart(Знач URL
-    , Знач Параметры = ""
-    , Знач Файлы = ""
-    , Знач ТипКонтента = "image/jpeg"
-    , Знач ДопЗаголовки = ""
-    , Знач ФайлОтвета = Неопределено) Экспорт
-
-    Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
-
-КонецФункции
-
-Функция PostMultipartRelated(Знач URL
-    , Знач JSON = ""
-    , Знач Файлы = ""
-    , Знач ДопЗаголовки = ""
-    , Знач ФайлОтвета = Неопределено) Экспорт
-       
-    Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки, ФайлОтвета);
-    
-КонецФункции
-
-Функция PatchMultipartRelated(Знач URL
-    , Знач JSON = ""
-    , Знач Файлы = ""
-    , Знач ДопЗаголовки = ""
-    , Знач ФайлОтвета = Неопределено) Экспорт  
-     
-    Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки, ФайлОтвета);
-    
-КонецФункции
-
-#КонецОбласти
-
-#Область Прочее
-
-Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт 
-    
-    Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда
-        Возврат;
-    КонецЕсли;
-    
-    ФайлТела = Ответ.ПолучитьИмяФайлаТела();
-    
-    Если Не ФайлТела = Неопределено Тогда
-        Ответ = ФайлТела;
-        Возврат;
-    КонецЕсли;
-    
-    GZip = "gzip";        
-    НужнаРаспаковка = 
-        Ответ.Заголовки.Получить("Content-Encoding") = GZip 
-        Или Ответ.Заголовки.Получить("content-encoding") = GZip;
-    
-    Если НужнаРаспаковка Тогда
-        Ответ = РаспаковатьОтвет(Ответ);
-    КонецЕсли;
-    
-    Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
-    
-    Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
-        
-        Попытка
-            Ответ = JsonВСтруктуру(Ответ);
-        Исключение
-            Возврат;
-        КонецПопытки;
-        
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт
-      
-    Заголовки = Новый Соответствие;
-    Заголовки.Вставить("Accept-Encoding", "gzip");
-    Заголовки.Вставить("Accept"         , "*/*");
-    Заголовки.Вставить("Connection"     , "keep-alive");
-    Заголовки.Вставить("Accept-Charset" , "utf-8");
-   
-    Если ЗначениеЗаполнено(ТипДанных) Тогда
-        Заголовки.Вставить("Content-Type", ТипДанных);
-    КонецЕсли;
-       
-    Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
-        
-        Для Каждого Заголовок Из ДопЗаголовки Цикл
-            Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
-        КонецЦикла;
-        
-    КонецЕсли;
-    
-    НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
-    
-    Возврат НовыйЗапрос;
-    
-КонецФункции
-
-Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт
-    
-    Попытка 
-        SSL = Новый ЗащищенноеСоединениеOpenSSL;
-        Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL);
-    Исключение
-        Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000);
-    КонецПопытки;
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область Служебные
-
-Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
-
-    Если Параметры.Количество() = 0 Тогда
-        Возврат "";
-    КонецЕсли;
-
-    СтрокаПараметров = "?";
-
-    Для Каждого Параметр Из Параметры Цикл
-        
-        ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение);
-        
-        СтрокаПараметров = СтрокаПараметров 
-            + Параметр.Ключ 
-            + "=" 
-            + ЗначениеПараметра
-            + "&";
-    КонецЦикла;
-
-    СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
-
-    Возврат СтрокаПараметров;
-
-КонецФункции
-
-Функция РазбитьURL(Знач URL) Экспорт
-
-    URL = СтрЗаменить(URL, "https://", "");
-    URL = СтрЗаменить(URL, "http://", "");
-    URL = СтрЗаменить(URL, ":443", "");
-
-    Адрес  = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1);
-    Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1);
-    
-    Попытка        
-        SSL = Новый ЗащищенноеСоединениеOpenSSL;   
-    Исключение
-        Сервер = "https://" + Сервер;
-    КонецПопытки;
-      
-    СтруктураВозврата = Новый Структура;
-    СтруктураВозврата.Вставить("Сервер", Сервер);
-    СтруктураВозврата.Вставить("Адрес" , Адрес);
-
-    Возврат СтруктураВозврата;
-
-КонецФункции
-
-Функция JsonВСтруктуру(Знач Текст) Экспорт
-
-    Если Не ЗначениеЗаполнено(Текст) Тогда
-        Возврат "";
-    КонецЕсли;
-    
-    Текст = ?(ТипЗнч(Текст) = Тип("ДвоичныеДанные"), ПолучитьСтрокуИзДвоичныхДанных(Текст), Текст);
-
-    ЧтениеJSON = Новый ЧтениеJSON;
-    ЧтениеJSON.УстановитьСтроку(Текст);
-
-    Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
-    ЧтениеJSON.Закрыть();
-
-    Возврат Данные;
-
-КонецФункции
-
-Функция JSONСтрокой(Знач Данные, Знач Экранирование = "Нет") Экспорт
-
-    ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows
-        , " "
-        , Истина
-        , ЭкранированиеСимволовJSON[Экранирование]
-        , Ложь
-        , Ложь
-        , Ложь
-        , Ложь);
-
-    Попытка
-        
-        ЗаписьJSON = Новый ЗаписьJSON;
-        ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
-    
-        ЗаписатьJSON(ЗаписьJSON, Данные);
-        Возврат ЗаписьJSON.Закрыть();
-    
-    Исключение      
-        Возврат "НЕ JSON: " + Строка(Данные);
-    КонецПопытки;
-
-КонецФункции
-
-Функция ЧислоВСтроку(Знач Число) Экспорт
-    Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
-КонецФункции
-
-Функция ПрочитатьJSONФайл(Знач Путь) Экспорт
-    
-    ЧтениеJSON = Новый ЧтениеJSON;
-    ЧтениеJSON.ОткрытьФайл(Путь);  
-    Значения = ПрочитатьJSON(ЧтениеJSON);
-    
-    ЧтениеJSON.Закрыть();
-    
-    Возврат Значения;
-    
-КонецФункции
-
-Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
-
-    СоответствиеВозврата = Новый Соответствие;
-    КоличествоЧастей     = 2;
-    МассивПараметров     = СтрРазделить(СтрокаПараметров, "&", Ложь);
-
-    Для Каждого Параметр Из МассивПараметров Цикл
-
-        МассивКлючЗначение = СтрРазделить(Параметр, "=");
-
-        Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
-            СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]);
-        КонецЕсли;
-
-    КонецЦикла;
-
-    Возврат СоответствиеВозврата;
-
-КонецФункции
-
-Функция ПолучитьТекущуюДату() Экспорт
-    Возврат МестноеВремя(ТекущаяУниверсальнаяДата());    
-КонецФункции
-
-Функция UNIXTime(Знач Дата) Экспорт
-    
-    ОТД  = Новый ОписаниеТипов("Дата");
-    Дата = ОТД.ПривестиЗначение(Дата);
-    
-    UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0");
-    UNIX = СтрЗаменить(UNIX, ",", "");
-    UNIX = Лев(UNIX, 10);
-    
-    Возврат UNIX;
-    
-КонецФункции
-
-Функция ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт
-    
-    Целое   = 100;
-    Текущее = Окр(Текущее / Делитель, 2);
-    Всего   = Окр(Всего / Делитель, 2); 
-    Процент = Цел(Текущее / Всего * Целое);
-             
-    СтрТекущее = ЧислоВСтроку(Текущее);
-    СтрВсего   = ЧислоВСтроку(Всего);
-    СтрПроцент = ЧислоВСтроку(Процент);
-   
-    Информация = СтрТекущее + "/" + СтрВсего + " " + ЕдИзм + " ( " + СтрПроцент + "% )";
-    
-    Возврат Информация;
-    
-КонецФункции
-
-Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт
-    
-    Размер = 0;
-    
-    Если ТипЗнч(Данные) = Тип("Строка") Тогда
-        
-        ФайлНаДиске = Новый Файл(Данные);
-        
-        Если ФайлНаДиске.Существует() Тогда         
-            Размер = ФайлНаДиске.Размер(); 
-        Иначе
-            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
-            Размер = Данные.Размер();
-        КонецЕсли;
-        
-    Иначе
-        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
-        Размер = Данные.Размер();
-    КонецЕсли;
-    
-    Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда
-        Если Размер < МинимальныйРазмерДляПотока Тогда
-            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
-        Иначе
-            OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные);    
-        КонецЕсли;     
-    Иначе
-        OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные);
-    КонецЕсли;
-    
-    Возврат Размер;
-    
-КонецФункции
-
-Процедура ЗначениеВМассив(Значение) Экспорт
-    
-    Значение_ = Новый Массив;
-    Значение_.Добавить(Значение);
-    Значение = Значение_;
-
-КонецПроцедуры
-
-Процедура ЗаменитьСпецСимволы(Текст, Разметка = "Markdown") Экспорт
-    
-    СоответствиеСимволов = Новый Соответствие;
-    
-    Если Разметка = "HTML" Тогда
-        
-        СоответствиеСимволов.Вставить("&", "&amp;");
-        
-    ИначеЕсли Разметка = "MarkdownV2" Тогда
-        
-        СоответствиеСимволов.Вставить("-", "\-");
-        СоответствиеСимволов.Вставить("+", "\+");
-        СоответствиеСимволов.Вставить("#", "\#");        
-        СоответствиеСимволов.Вставить("=", "\=");
-        СоответствиеСимволов.Вставить("{", "\{");        
-        СоответствиеСимволов.Вставить("}", "\}");        
-        СоответствиеСимволов.Вставить(".", "\.");
-      
-    Иначе
-        Возврат;
-    КонецЕсли;         
-
-    Для Каждого СимволМассива Из СоответствиеСимволов Цикл
-        Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
-    КонецЦикла;
-
-КонецПроцедуры
-
-Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт
-    
-    ТипКоллекции        = ТипЗнч(Коллекция);
-    ВыходнаяКоллекция   = Новый(ТипКоллекции);
-    
-    Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда
-        
-        УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция);
-        
-    ИначеЕсли ТипКоллекции = Тип("Массив") Тогда
-        
-        УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция);
-        
-    Иначе
-        
-        ВыходнаяКоллекция = Коллекция;
-        
-    КонецЕсли;
-    
-    Коллекция = ВыходнаяКоллекция;
-    
-КонецПроцедуры
-
-Процедура Пауза(Знач Секунды) Экспорт
-    
-    Соединение = Новый HTTPСоединение("1C.ru", 11111, , , , Секунды);
-    Попытка
-        Соединение.Получить(Новый HTTPЗапрос(""));
-    Исключение
-        Возврат;  
-    КонецПопытки;
-    
-КонецПроцедуры
-
-Процедура ДобавитьПоле(Знач Имя, Знач Значение, Знач Тип, Коллекция) Экспорт
-    
-    Заполнено = ЗначениеЗаполнено(Значение);
-    
-    Если Не Заполнено Тогда
-        Возврат;
-    КонецЕсли;
-    
-    Если Тип = "Дата" Тогда
-        OPI_ПреобразованиеТипов.ПолучитьДату(Значение);
-        Значение = UNIXTime(Значение);
-        
-    ИначеЕсли Тип = "Коллекция" Тогда
-        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение); 
-        
-    ИначеЕсли Тип = "Булево" Тогда
-        OPI_ПреобразованиеТипов.ПолучитьБулево(Значение); 
-        
-    ИначеЕсли Тип = "СтрокаФайла" Тогда
-        OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина);
-        
-    ИначеЕсли Тип = "Массив" Тогда
-        OPI_ПреобразованиеТипов.ПолучитьМассив(Значение);
-        
-    ИначеЕсли Тип = "ДвоичныеДанные" Тогда
-        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение);
-        
-    ИначеЕсли Тип = "Число" Тогда
-        OPI_ПреобразованиеТипов.ПолучитьЧисло(Значение);
-        
-    Иначе
-        OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
-        
-    КонецЕсли;
-    
-    Коллекция.Вставить(Имя, Значение);
-    
-КонецПроцедуры
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ВыполнитьЗапросСТелом(Знач URL
-    , Знач Вид
-    , Знач Параметры = ""
-    , Знач ДопЗаголовки = ""
-    , Знач JSON = Истина
-    , Знач ПолныйОтвет = Ложь
-    , Знач ФайлОтвета = Неопределено)
-    
-    Если Не ЗначениеЗаполнено(Параметры) Тогда
-        Параметры = Новый Структура;
-    КонецЕсли;
-    
-    ТипДанных     = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");   
-    СтруктураURL  = РазбитьURL(URL);
-    Сервер        = СтруктураURL["Сервер"];
-    Адрес         = СтруктураURL["Адрес"];
-    
-    Запрос        = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
-    Соединение    = СоздатьСоединение(Сервер);
-    
-    УстановитьТелоЗапроса(Запрос, Параметры, JSON);
-
-    Если ЗначениеЗаполнено(ФайлОтвета) Тогда
-        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
-    Иначе
-        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
-    КонецЕсли;
-     
-    Если ЭтоПереадресация(Ответ) Тогда  
-        Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"]
-            , Вид
-            , Параметры
-            , ДопЗаголовки
-            , JSON
-            , ПолныйОтвет
-            , ФайлОтвета);    
-    Иначе    
-        ОбработатьОтвет(Ответ, ПолныйОтвет);      
-    КонецЕсли;
-
-    Возврат Ответ;
-
-КонецФункции
-
-Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL
-    , Знач Вид
-    , Знач Данные
-    , Знач ДопЗаголовки
-    , Знач ПолныйОтвет
-    , Знач ТипДанных)
-    
-    СтруктураURL  = РазбитьURL(URL);
-    Сервер        = СтруктураURL["Сервер"];
-    Адрес         = СтруктураURL["Адрес"];
-    
-    Запрос        = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
-    Соединение    = СоздатьСоединение(Сервер);
-    
-    Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
-    
-    Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
-
-    Если ЭтоПереадресация(Ответ) Тогда  
-        Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"]
-            , Вид
-            , Данные
-            , ДопЗаголовки
-            , ПолныйОтвет
-            , ТипДанных);    
-    Иначе    
-        ОбработатьОтвет(Ответ, ПолныйОтвет);      
-    КонецЕсли;
-
-    Возврат Ответ;
-
-КонецФункции
-
-Функция ВыполнитьЗапросБезТела(Знач URL
-    , Знач Вид
-    , Знач Параметры = ""
-    , Знач ДопЗаголовки = ""
-    , Знач ФайлОтвета = Неопределено)
-    
-    Если Не ЗначениеЗаполнено(Параметры) Тогда
-        Параметры = Новый Структура;
-    КонецЕсли;
-
-    СтруктураURL        = РазбитьURL(URL);
-    Сервер              = СтруктураURL["Сервер"];
-    Адрес               = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры);
-    
-    Запрос     = СоздатьЗапрос(Адрес, ДопЗаголовки);
-    Соединение = СоздатьСоединение(Сервер);  
-     
-    Если ЗначениеЗаполнено(ФайлОтвета) Тогда
-        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
-    Иначе
-        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
-    КонецЕсли;
-      
-    Если ЭтоПереадресация(Ответ) Тогда  
-        Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета);    
-    Иначе    
-        ОбработатьОтвет(Ответ);      
-    КонецЕсли;
-
-    Возврат Ответ;
-    
-КонецФункции
-
-Функция ВыполнитьЗапросМультипарт(Знач URL
-    , Знач Вид
-    , Знач Параметры = ""
-    , Знач Файлы = ""
-    , Знач ТипКонтента = "image/jpeg"
-    , Знач ДопЗаголовки = ""
-    , Знач ФайлОтвета = Неопределено)
-    
-    Если Не ЗначениеЗаполнено(Параметры) Тогда
-        Параметры = Новый Структура;
-    КонецЕсли;
-
-    Если Не ЗначениеЗаполнено(Файлы) Тогда
-        Файлы = Новый Соответствие;
-    КонецЕсли;
-
-    Переадресация    = 300;
-    Ошибка           = 400;
-    Boundary         = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
-    РазделительСтрок = Символы.ВК + Символы.ПС;
-    ТипДанных        = "multipart/form-data; boundary=" + Boundary;
-    СтруктураURL     = РазбитьURL(URL);
-    Сервер           = СтруктураURL["Сервер"];
-    Адрес            = СтруктураURL["Адрес"];
-    
-    Запрос        = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
-    Соединение    = СоздатьСоединение(Сервер);
-    
-    ТелоЗапроса  = ПолучитьИмяВременногоФайла();
-    ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
-        , КодировкаТекста.UTF8
-        , ПорядокБайтов.LittleEndian
-        , ""
-        , Ложь
-        , ""
-        , Ложь);
-
-    ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
-    ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
-    
-    ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
-    ЗаписьТекста.Закрыть();
-
-    Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
-    
-    Если ЗначениеЗаполнено(ФайлОтвета) Тогда
-        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
-    Иначе
-        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
-    КонецЕсли;
-        
-    ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
-   
-    Если ЭтоПереадресация Тогда  
-        Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"]
-            , Вид
-            , Параметры
-            , Файлы
-            , ТипКонтента
-            , ДопЗаголовки
-            , ФайлОтвета);    
-    Иначе    
-        ОбработатьОтвет(Ответ);      
-    КонецЕсли;
-    
-    Запрос       = Неопределено;
-    ЗаписьТекста = Неопределено;
-    
-    УдалитьФайлы(ТелоЗапроса);
-    Возврат Ответ;
-       
-КонецФункции
-
-Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL
-    , Знач Вид
-    , Знач JSON = ""
-    , Знач Файлы = ""
-    , Знач ДопЗаголовки = ""
-    , Знач ФайлОтвета = Неопределено) 
-    
-    Переадресация    = 300;
-    Ошибка           = 400;
-    Boundary         = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
-    РазделительСтрок = Символы.ВК + Символы.ПС;
-    ТипДанных        = "multipart/related; boundary=" + Boundary;
-    СтруктураURL     = РазбитьURL(URL);
-    Сервер           = СтруктураURL["Сервер"];
-    Адрес            = СтруктураURL["Адрес"];
-    
-    Запрос        = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
-    Соединение    = СоздатьСоединение(Сервер);
-    
-    ТелоЗапроса  = ПолучитьИмяВременногоФайла();
-    ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
-        , КодировкаТекста.UTF8
-        , ПорядокБайтов.LittleEndian
-        , ""
-        , Ложь
-        , ""
-        , Ложь);
-    
-    ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
-    ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);        
-    
-    ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
-    ЗаписьТекста.Закрыть();
-    
-    ДобавитьContentLength(Запрос);
-    
-    Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
-    
-    Если ЗначениеЗаполнено(ФайлОтвета) Тогда
-        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
-    Иначе
-        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
-    КонецЕсли;
-        
-    ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
-    
-    Если ЭтоПереадресация Тогда  
-        Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"]
-            , Вид
-            , JSON
-            , Файлы
-            , ДопЗаголовки
-            , ФайлОтвета);    
-    Иначе    
-        ОбработатьОтвет(Ответ);      
-    КонецЕсли;
-    
-    Запрос       = Неопределено;
-    ЗаписьТекста = Неопределено;
-
-    УдалитьФайлы(ТелоЗапроса);
-    Возврат Ответ;
-
-КонецФункции
-
-Функция ЭтоПереадресация(Знач Ответ)
-    
-    Переадресация  = 300;
-    Ошибка         = 400;
-
-    ЭтоПереадресация = Ответ.КодСостояния >= Переадресация 
-        И Ответ.КодСостояния < Ошибка
-        И ЗначениеЗаполнено(Ответ.Заголовки["Location"]);
-    
-    Возврат ЭтоПереадресация;
-    
-КонецФункции
-
-Функция ПреобразоватьПараметрВСтроку(Знач Значение)
-
-    Если ТипЗнч(Значение) = Тип("Массив") Тогда
-        Значение = СтрСоединить(Значение, ",");
-        Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
-        Значение = "[" + Значение + "]"; 
-    Иначе
-        Значение = ЧислоВСтроку(Значение);
-        Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
-    КонецЕсли;
-    
-    Возврат Значение;
-    
-КонецФункции
-
-Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON)
-    
-    Коллекция = ТипЗнч(Параметры) = Тип("Структура") 
-        Или ТипЗнч(Параметры) = Тип("Соответствие")
-        Или ТипЗнч(Параметры) = Тип("Массив");
-        
-    Если JSON Тогда
-        Данные           = JSONСтрокой(Параметры);
-    ИначеЕсли Не Коллекция Тогда
-        Данные = Параметры;
-    Иначе
-        СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
-        Данные           = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
-    КонецЕсли;
-    
-    Если ТипЗнч(Данные) = Тип("Строка") Тогда
-        Запрос.УстановитьТелоИзСтроки(Данные);
-    Иначе
-        //@skip-check wrong-type-expression
-        Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
-    КонецЕсли;
-    
-КонецПроцедуры
-
-Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры)
-    
-    РазделительСтрок = Символы.ВК + Символы.ПС;
-    
-    Для Каждого Параметр Из Параметры Цикл
-        
-        Если Параметр.Значение = Неопределено
-            Или Параметр.Значение = NULL Тогда
-            Продолжить;
-        КонецЕсли;
-        
-        ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
-        ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """");
-        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-        
-        Если ТипЗнч(Параметр.Значение) = Тип("Строка") 
-            Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда
-            
-            ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение);
-            ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой);
-            
-        ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда
-            
-            ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false"));
-            
-        Иначе
-            
-            ЗаписьТекста.Записать(Параметр.Значение);
-            
-        КонецЕсли;
-        
-        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-        
-    КонецЦикла;
-    
-КонецПроцедуры
-
-Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы)
-    
-    ТипКонтента      = СокрЛП(ТипКонтента);
-    РазделительСтрок = Символы.ВК + Символы.ПС;
-    ЗаменаТочки      = "___";
-    
-    Для Каждого Файл Из Файлы Цикл
-        
-        ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
-        
-        Если ТипКонтента = "image/jpeg" Тогда
-            ИмяФайлаОтправки = "photo";
-        Иначе
-            ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
-            ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1);
-            ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ,
-            ЗаменаТочки, "."));
-        КонецЕсли;
-        
-        ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
-        ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" 
-            + ИмяФайлаОтправки 
-            + """; filename=""" 
-            + ПутьФайл
-            + """");
-        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);      
-        
-        Если ЗначениеЗаполнено(ТипКонтента) Тогда
-            ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента);
-        КонецЕсли;
-        
-        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-        ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Значение);
-        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-        
-    КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы)
-    
-    Если Не ЗначениеЗаполнено(Файлы) Тогда
-        Возврат;
-    КонецЕсли;
-    
-    РазделительСтрок = Символы.ВК + Символы.ПС;
-    
-    Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда
-        Для Каждого Файл Из Файлы Цикл
-            
-            ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
-            ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение);
-            ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-            ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-            ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Ключ);
-            ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-            ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-            
-        КонецЦикла;
-        
-    КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ЗаписатьДвоичныеДанные(ЗаписьДанных, Знач ДвоичныеДанные)
-    
-    РазмерЧасти      = 268435456;
-    ПрочитанноБайт   = 0;
-    ТекущаяПозиция   = 0;
-    ОбщийРазмер      = ДвоичныеДанные.Размер();
-
-    Пока ПрочитанноБайт < ОбщийРазмер Цикл
-        
-        ЧтениеДанных     = Новый ЧтениеДанных(ДвоичныеДанные);
-        ПрочитанноБайт   = ЧтениеДанных.Пропустить(ТекущаяПозиция);
-        Результат        = ЧтениеДанных.Прочитать(РазмерЧасти);
-        ТекущиеДанные    = Результат.ПолучитьДвоичныеДанные();
-        РазмерТекущих    = ТекущиеДанные.Размер();
-        
-        Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
-            Прервать;
-        КонецЕсли;
-
-        ЗаписьДанных.Записать(ТекущиеДанные);
-        
-        ОсвободитьОбъект(ТекущиеДанные);
-        ВыполнитьСборкуМусора();
-
-        ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих;
-        
-    КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON)
-    
-    Если Не ЗначениеЗаполнено(JSON) Тогда
-        Возврат;
-    КонецЕсли;
-    
-    РазделительСтрок = Символы.ВК + Символы.ПС;
-    
-    ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
-    ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8");
-    ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-    ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-    ЗаписьТекста.ЗаписатьСтроку(JSON);
-    ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-    ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-
-КонецПроцедуры
-
-Процедура ДобавитьContentLength(Запрос)
-    
-    ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
-    
-    Если ЗначениеЗаполнено(ТелоЗапроса) Тогда
-        
-        Размер = ТелоЗапроса.Размер();
-        Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер));
-        
-    КонецЕсли;
-
-КонецПроцедуры
-
-Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция)
-    
-    Для Каждого ЭлементКоллекции Из Коллекция Цикл
-        
-        Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда
-            ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение);
-        КонецЕсли;
-        
-    КонецЦикла;
-    
-КонецПроцедуры
-
-Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция)
-    
-    Для Каждого ЭлементКоллекции Из Коллекция Цикл
-        
-        Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда
-            ВыходнаяКоллекция.Добавить(ЭлементКоллекции);
-        КонецЕсли;
-        
-    КонецЦикла;
-    
-КонецПроцедуры
-
-#Область GZip
-
-// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
-// Источник: https://github.com/vbondarevsky/Connector 
-
-// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
-//
-// Copyright 2017-2023 Vladimir Bondarevskiy
-//
-//   Licensed under the Apache License, Version 2.0 (the "License");
-//   you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-//       http://www.apache.org/licenses/LICENSE-2.0
-//
-//   Unless required by applicable law or agreed to in writing, software
-//   distributed under the License is distributed on an "AS IS" BASIS,
-//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-//   limitations under the License.
-//
-//
-// URL:    https://github.com/vbondarevsky/Connector
-// e-mail: vbondarevsky@gmail.com
-// Версия: 2.4.8
-//
-// Требования: платформа 1С версии 8.3.10 и выше
-
-Функция РаспаковатьОтвет(Ответ)
-
-    Попытка
-        Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
-    Исключение
-        Возврат Ответ;
-    КонецПопытки;
-
-КонецФункции
-
-Функция ПрочитатьGZip(СжатыеДанные) Экспорт
-
-    РазмерПрефиксаGZip  = 10;
-    РазмерПостфиксаGZip = 8;
-    
-    РазмерДД  = ZipРазмерDD();
-    РазмерСДХ = ZipРазмерCDH();
-    РазмерЕСД = ZipРазмерEOCD();
-    РазмерЛФХ = ZipРазмерLFH();
-
-    ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
-    ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
-    РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
-
-    ПотокZip     = Новый ПотокВПамяти(РазмерЛФХ 
-       + РазмерСжатыхДанных 
-       + РазмерДД 
-       + РазмерСДХ 
-       + РазмерЕСД);
-       
-    ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
-    ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
-    ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
-
-    ЗаписьДанных.Закрыть();
-    ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
-
-    CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
-    РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
-    ЧтениеДанных.Закрыть();
-
-    ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
-    ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
-    ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
-    ЗаписьДанных.Закрыть();
-
-    Возврат ПрочитатьZip(ПотокZip);
-
-КонецФункции
-
-Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено)
-
-    Каталог   = ПолучитьИмяВременногоФайла();
-    ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
-    ИмяФайла  = ЧтениеZip.Элементы[0].Имя;
-    Попытка
-        ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
-    Исключение
-        // Игнорируем проверку целостности архива, просто читаем результат
-        ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
-    КонецПопытки;
-    ЧтениеZip.Закрыть();
-
-    Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
-    УдалитьФайлы(Каталог);
-
-    Возврат Результат;
-
-КонецФункции
-
-Функция ZipРазмерLFH()
-
-    Возврат 34;
-
-КонецФункции
-
-Функция ZipРазмерDD()
-
-    Возврат 16;
-
-КонецФункции
-
-Функция ZipРазмерCDH()
-
-    Возврат 50;
-
-КонецФункции
-
-Функция ZipРазмерEOCD()
-
-    Возврат 22;
-
-КонецФункции
-
-Функция ZipLFH()
-    
-    // Local file header
-    Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH());
-    Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50
-    Буфер.ЗаписатьЦелое16(4, 20);       // version
-    Буфер.ЗаписатьЦелое16(6, 10);       // bit flags    
-    Буфер.ЗаписатьЦелое16(8, 8);        // compression method
-    Буфер.ЗаписатьЦелое16(10, 0);       // time
-    Буфер.ЗаписатьЦелое16(12, 0);       // date
-    Буфер.ЗаписатьЦелое32(14, 0);       // crc-32
-    Буфер.ЗаписатьЦелое32(18, 0);       // compressed size
-    Буфер.ЗаписатьЦелое32(22, 0);       // uncompressed size
-    Буфер.ЗаписатьЦелое16(26, 4);       // filename legth - "data"
-    Буфер.ЗаписатьЦелое16(28, 0);       // extra field length
-    Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
-
-    Возврат Буфер;
-
-КонецФункции
-
-Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
-    
-    // Data descriptor
-    Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD());
-    Буфер.ЗаписатьЦелое32(0, 134695760);
-    Буфер.ЗаписатьЦелое32(4, CRC32);
-    Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных);
-    Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных);
-
-    Возврат Буфер;
-
-КонецФункции
-
-Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
-    
-    // Central directory header
-    Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH());
-    Буфер.ЗаписатьЦелое32(0, 33639248);              // signature 0x02014b50
-    Буфер.ЗаписатьЦелое16(4, 798);                   // version made by
-    Буфер.ЗаписатьЦелое16(6, 20);                    // version needed to extract
-    Буфер.ЗаписатьЦелое16(8, 10);                    // bit flags
-    Буфер.ЗаписатьЦелое16(10, 8);                    // compression method
-    Буфер.ЗаписатьЦелое16(12, 0);                    // time
-    Буфер.ЗаписатьЦелое16(14, 0);                    // date
-    Буфер.ЗаписатьЦелое32(16, CRC32);                // crc-32
-    Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных);   // compressed size
-    Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size
-    Буфер.ЗаписатьЦелое16(28, 4);                    // file name length
-    Буфер.ЗаписатьЦелое16(30, 0);                    // extra field length
-    Буфер.ЗаписатьЦелое16(32, 0);                    // file comment length
-    Буфер.ЗаписатьЦелое16(34, 0);                    // disk number start
-    Буфер.ЗаписатьЦелое16(36, 0);                    // internal file attributes
-    Буфер.ЗаписатьЦелое32(38, 2176057344);           // external file attributes
-    Буфер.ЗаписатьЦелое32(42, 0);                    // relative offset of local header
-    Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
-
-    Возврат Буфер;
-
-КонецФункции
-
-Функция ZipEOCD(РазмерСжатыхДанных)
-    
-    // End of central directory
-    РазмерCDH = 50;
-    Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD());
-    Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50
-    Буфер.ЗаписатьЦелое16(4, 0); // number of this disk
-    Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory
-    Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk
-    Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory
-    Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory    
-    // offset of start of central directory with respect to the starting disk number
-    Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD());
-    Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number
-
-    Возврат Буфер;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
+// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UnusedLocalVariable-off
+// BSLLS:UsingServiceTag-off
+// BSLLS:NumberOfOptionalParams-off
+
+//@skip-check module-unused-local-variable
+//@skip-check method-too-many-params
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+#Область HTTPМетоды
+
+#Область ЗапросыБезТела
+
+Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт
+    Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета);
+КонецФункции
+
+Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт
+    Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета);
+КонецФункции
+
+#КонецОбласти
+
+#Область ЗапросыСТелом
+
+Функция Post(Знач URL
+    , Знач Параметры = ""
+    , Знач ДопЗаголовки = ""
+    , Знач JSON = Истина
+    , Знач ПолныйОтвет = Ложь
+    , Знач ФайлОтвета = Неопределено) Экспорт
+    
+    Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
+    
+КонецФункции
+
+Функция Patch(Знач URL
+    , Знач Параметры = ""
+    , Знач ДопЗаголовки = ""
+    , Знач JSON = Истина
+    , Знач ПолныйОтвет = Ложь
+    , Знач ФайлОтвета = Неопределено) Экспорт
+    
+    Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
+    
+КонецФункции
+
+Функция Put(Знач URL
+    , Знач Параметры = ""
+    , Знач ДопЗаголовки = ""
+    , Знач JSON = Истина
+    , Знач ПолныйОтвет = Ложь
+    , Знач ФайлОтвета = Неопределено) Экспорт
+    
+    Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
+    
+КонецФункции
+
+Функция PostBinary(Знач URL
+    , Знач Тело
+    , Знач ДопЗаголовки
+    , Знач ПолныйОтвет = Ложь
+    , Знач ТипДанных = "application/octet-stream") Экспорт
+    
+    Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет, ТипДанных);
+    
+КонецФункции
+
+#КонецОбласти 
+
+#Область ЗапросыMultipart
+
+Функция PostMultipart(Знач URL
+    , Знач Параметры = ""
+    , Знач Файлы = ""
+    , Знач ТипКонтента = "image/jpeg"
+    , Знач ДопЗаголовки = ""
+    , Знач ФайлОтвета = Неопределено) Экспорт
+
+    Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
+
+КонецФункции
+
+Функция PutMultipart(Знач URL
+    , Знач Параметры = ""
+    , Знач Файлы = ""
+    , Знач ТипКонтента = "image/jpeg"
+    , Знач ДопЗаголовки = ""
+    , Знач ФайлОтвета = Неопределено) Экспорт
+
+    Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
+
+КонецФункции
+
+Функция PostMultipartRelated(Знач URL
+    , Знач JSON = ""
+    , Знач Файлы = ""
+    , Знач ДопЗаголовки = ""
+    , Знач ФайлОтвета = Неопределено) Экспорт
+       
+    Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки, ФайлОтвета);
+    
+КонецФункции
+
+Функция PatchMultipartRelated(Знач URL
+    , Знач JSON = ""
+    , Знач Файлы = ""
+    , Знач ДопЗаголовки = ""
+    , Знач ФайлОтвета = Неопределено) Экспорт  
+     
+    Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки, ФайлОтвета);
+    
+КонецФункции
+
+#КонецОбласти
+
+#Область Прочее
+
+Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт 
+    
+    Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда
+        Возврат;
+    КонецЕсли;
+    
+    ФайлТела = Ответ.ПолучитьИмяФайлаТела();
+    
+    Если Не ФайлТела = Неопределено Тогда
+        Ответ = ФайлТела;
+        Возврат;
+    КонецЕсли;
+    
+    GZip = "gzip";        
+    НужнаРаспаковка = 
+        Ответ.Заголовки.Получить("Content-Encoding") = GZip 
+        Или Ответ.Заголовки.Получить("content-encoding") = GZip;
+    
+    Если НужнаРаспаковка Тогда
+        Ответ = РаспаковатьОтвет(Ответ);
+    КонецЕсли;
+    
+    Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
+    
+    Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
+        
+        Попытка
+            Ответ = JsonВСтруктуру(Ответ);
+        Исключение
+            Возврат;
+        КонецПопытки;
+        
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт
+      
+    Заголовки = Новый Соответствие;
+    Заголовки.Вставить("Accept-Encoding", "gzip");
+    Заголовки.Вставить("Accept"         , "*/*");
+    Заголовки.Вставить("Connection"     , "keep-alive");
+    Заголовки.Вставить("Accept-Charset" , "utf-8");
+   
+    Если ЗначениеЗаполнено(ТипДанных) Тогда
+        Заголовки.Вставить("Content-Type", ТипДанных);
+    КонецЕсли;
+       
+    Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
+        
+        Для Каждого Заголовок Из ДопЗаголовки Цикл
+            Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
+        КонецЦикла;
+        
+    КонецЕсли;
+    
+    НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
+    
+    Возврат НовыйЗапрос;
+    
+КонецФункции
+
+Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт
+    
+    Попытка 
+        SSL = Новый ЗащищенноеСоединениеOpenSSL;
+        Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL);
+    Исключение
+        Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000);
+    КонецПопытки;
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область Служебные
+
+Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
+
+    Если Параметры.Количество() = 0 Тогда
+        Возврат "";
+    КонецЕсли;
+
+    СтрокаПараметров = "?";
+
+    Для Каждого Параметр Из Параметры Цикл
+        
+        ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение);
+        
+        СтрокаПараметров = СтрокаПараметров 
+            + Параметр.Ключ 
+            + "=" 
+            + ЗначениеПараметра
+            + "&";
+    КонецЦикла;
+
+    СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
+
+    Возврат СтрокаПараметров;
+
+КонецФункции
+
+Функция РазбитьURL(Знач URL) Экспорт
+
+    URL = СтрЗаменить(URL, "https://", "");
+    URL = СтрЗаменить(URL, "http://", "");
+    URL = СтрЗаменить(URL, ":443", "");
+
+    Адрес  = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1);
+    Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1);
+    
+    Попытка        
+        SSL = Новый ЗащищенноеСоединениеOpenSSL;   
+    Исключение
+        Сервер = "https://" + Сервер;
+    КонецПопытки;
+      
+    СтруктураВозврата = Новый Структура;
+    СтруктураВозврата.Вставить("Сервер", Сервер);
+    СтруктураВозврата.Вставить("Адрес" , Адрес);
+
+    Возврат СтруктураВозврата;
+
+КонецФункции
+
+Функция JsonВСтруктуру(Знач Текст) Экспорт
+
+    Если Не ЗначениеЗаполнено(Текст) Тогда
+        Возврат "";
+    КонецЕсли;
+    
+    Текст = ?(ТипЗнч(Текст) = Тип("ДвоичныеДанные"), ПолучитьСтрокуИзДвоичныхДанных(Текст), Текст);
+
+    ЧтениеJSON = Новый ЧтениеJSON;
+    ЧтениеJSON.УстановитьСтроку(Текст);
+
+    Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
+    ЧтениеJSON.Закрыть();
+
+    Возврат Данные;
+
+КонецФункции
+
+Функция JSONСтрокой(Знач Данные, Знач Экранирование = "Нет") Экспорт
+
+    ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows
+        , " "
+        , Истина
+        , ЭкранированиеСимволовJSON[Экранирование]
+        , Ложь
+        , Ложь
+        , Ложь
+        , Ложь);
+
+    Попытка
+        
+        ЗаписьJSON = Новый ЗаписьJSON;
+        ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
+    
+        ЗаписатьJSON(ЗаписьJSON, Данные);
+        Возврат ЗаписьJSON.Закрыть();
+    
+    Исключение      
+        Возврат "НЕ JSON: " + Строка(Данные);
+    КонецПопытки;
+
+КонецФункции
+
+Функция ЧислоВСтроку(Знач Число) Экспорт
+    Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
+КонецФункции
+
+Функция ПрочитатьJSONФайл(Знач Путь) Экспорт
+    
+    ЧтениеJSON = Новый ЧтениеJSON;
+    ЧтениеJSON.ОткрытьФайл(Путь);  
+    Значения = ПрочитатьJSON(ЧтениеJSON);
+    
+    ЧтениеJSON.Закрыть();
+    
+    Возврат Значения;
+    
+КонецФункции
+
+Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
+
+    СоответствиеВозврата = Новый Соответствие;
+    КоличествоЧастей     = 2;
+    МассивПараметров     = СтрРазделить(СтрокаПараметров, "&", Ложь);
+
+    Для Каждого Параметр Из МассивПараметров Цикл
+
+        МассивКлючЗначение = СтрРазделить(Параметр, "=");
+
+        Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
+            СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]);
+        КонецЕсли;
+
+    КонецЦикла;
+
+    Возврат СоответствиеВозврата;
+
+КонецФункции
+
+Функция ПолучитьТекущуюДату() Экспорт
+    Возврат МестноеВремя(ТекущаяУниверсальнаяДата());    
+КонецФункции
+
+Функция UNIXTime(Знач Дата) Экспорт
+    
+    ОТД  = Новый ОписаниеТипов("Дата");
+    Дата = ОТД.ПривестиЗначение(Дата);
+    
+    UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0");
+    UNIX = СтрЗаменить(UNIX, ",", "");
+    UNIX = Лев(UNIX, 10);
+    
+    Возврат UNIX;
+    
+КонецФункции
+
+Функция ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт
+    
+    Целое   = 100;
+    Текущее = Окр(Текущее / Делитель, 2);
+    Всего   = Окр(Всего / Делитель, 2); 
+    Процент = Цел(Текущее / Всего * Целое);
+             
+    СтрТекущее = ЧислоВСтроку(Текущее);
+    СтрВсего   = ЧислоВСтроку(Всего);
+    СтрПроцент = ЧислоВСтроку(Процент);
+   
+    Информация = СтрТекущее + "/" + СтрВсего + " " + ЕдИзм + " ( " + СтрПроцент + "% )";
+    
+    Возврат Информация;
+    
+КонецФункции
+
+Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт
+    
+    Размер = 0;
+    
+    Если ТипЗнч(Данные) = Тип("Строка") Тогда
+        
+        ФайлНаДиске = Новый Файл(Данные);
+        
+        Если ФайлНаДиске.Существует() Тогда         
+            Размер = ФайлНаДиске.Размер(); 
+        Иначе
+            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
+            Размер = Данные.Размер();
+        КонецЕсли;
+        
+    Иначе
+        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
+        Размер = Данные.Размер();
+    КонецЕсли;
+    
+    Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда
+        Если Размер < МинимальныйРазмерДляПотока Тогда
+            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
+        Иначе
+            OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные);    
+        КонецЕсли;     
+    Иначе
+        OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные);
+    КонецЕсли;
+    
+    Возврат Размер;
+    
+КонецФункции
+
+Процедура ЗначениеВМассив(Значение) Экспорт
+    
+    Значение_ = Новый Массив;
+    Значение_.Добавить(Значение);
+    Значение = Значение_;
+
+КонецПроцедуры
+
+Процедура ЗаменитьСпецСимволы(Текст, Разметка = "Markdown") Экспорт
+    
+    СоответствиеСимволов = Новый Соответствие;
+    
+    Если Разметка = "HTML" Тогда
+        
+        СоответствиеСимволов.Вставить("&", "&amp;");
+        
+    ИначеЕсли Разметка = "MarkdownV2" Тогда
+        
+        СоответствиеСимволов.Вставить("-", "\-");
+        СоответствиеСимволов.Вставить("+", "\+");
+        СоответствиеСимволов.Вставить("#", "\#");        
+        СоответствиеСимволов.Вставить("=", "\=");
+        СоответствиеСимволов.Вставить("{", "\{");        
+        СоответствиеСимволов.Вставить("}", "\}");        
+        СоответствиеСимволов.Вставить(".", "\.");
+      
+    Иначе
+        Возврат;
+    КонецЕсли;         
+
+    Для Каждого СимволМассива Из СоответствиеСимволов Цикл
+        Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
+    КонецЦикла;
+
+КонецПроцедуры
+
+Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт
+    
+    ТипКоллекции        = ТипЗнч(Коллекция);
+    ВыходнаяКоллекция   = Новый(ТипКоллекции);
+    
+    Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда
+        
+        УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция);
+        
+    ИначеЕсли ТипКоллекции = Тип("Массив") Тогда
+        
+        УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция);
+        
+    Иначе
+        
+        ВыходнаяКоллекция = Коллекция;
+        
+    КонецЕсли;
+    
+    Коллекция = ВыходнаяКоллекция;
+    
+КонецПроцедуры
+
+Процедура Пауза(Знач Секунды) Экспорт
+    
+    Соединение = Новый HTTPСоединение("1C.ru", 11111, , , , Секунды);
+    Попытка
+        Соединение.Получить(Новый HTTPЗапрос(""));
+    Исключение
+        Возврат;  
+    КонецПопытки;
+    
+КонецПроцедуры
+
+Процедура ДобавитьПоле(Знач Имя, Знач Значение, Знач Тип, Коллекция) Экспорт
+    
+    Заполнено = ЗначениеЗаполнено(Значение);
+    
+    Если Не Заполнено Тогда
+        Возврат;
+    КонецЕсли;
+    
+    Если Тип = "Дата" Тогда
+        OPI_ПреобразованиеТипов.ПолучитьДату(Значение);
+        Значение = UNIXTime(Значение);
+        
+    ИначеЕсли Тип = "Коллекция" Тогда
+        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение); 
+        
+    ИначеЕсли Тип = "Булево" Тогда
+        OPI_ПреобразованиеТипов.ПолучитьБулево(Значение); 
+        
+    ИначеЕсли Тип = "СтрокаФайла" Тогда
+        OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина);
+        
+    ИначеЕсли Тип = "Массив" Тогда
+        OPI_ПреобразованиеТипов.ПолучитьМассив(Значение);
+        
+    ИначеЕсли Тип = "ДвоичныеДанные" Тогда
+        OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение);
+        
+    ИначеЕсли Тип = "Число" Тогда
+        OPI_ПреобразованиеТипов.ПолучитьЧисло(Значение);
+        
+    Иначе
+        OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
+        
+    КонецЕсли;
+    
+    Коллекция.Вставить(Имя, Значение);
+    
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ВыполнитьЗапросСТелом(Знач URL
+    , Знач Вид
+    , Знач Параметры = ""
+    , Знач ДопЗаголовки = ""
+    , Знач JSON = Истина
+    , Знач ПолныйОтвет = Ложь
+    , Знач ФайлОтвета = Неопределено)
+    
+    Если Не ЗначениеЗаполнено(Параметры) Тогда
+        Параметры = Новый Структура;
+    КонецЕсли;
+    
+    ТипДанных     = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");   
+    СтруктураURL  = РазбитьURL(URL);
+    Сервер        = СтруктураURL["Сервер"];
+    Адрес         = СтруктураURL["Адрес"];
+    
+    Запрос        = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
+    Соединение    = СоздатьСоединение(Сервер);
+    
+    УстановитьТелоЗапроса(Запрос, Параметры, JSON);
+
+    Если ЗначениеЗаполнено(ФайлОтвета) Тогда
+        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
+    Иначе
+        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+    КонецЕсли;
+     
+    Если ЭтоПереадресация(Ответ) Тогда  
+        Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"]
+            , Вид
+            , Параметры
+            , ДопЗаголовки
+            , JSON
+            , ПолныйОтвет
+            , ФайлОтвета);    
+    Иначе    
+        ОбработатьОтвет(Ответ, ПолныйОтвет);      
+    КонецЕсли;
+
+    Возврат Ответ;
+
+КонецФункции
+
+Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL
+    , Знач Вид
+    , Знач Данные
+    , Знач ДопЗаголовки
+    , Знач ПолныйОтвет
+    , Знач ТипДанных)
+    
+    СтруктураURL  = РазбитьURL(URL);
+    Сервер        = СтруктураURL["Сервер"];
+    Адрес         = СтруктураURL["Адрес"];
+    
+    Запрос        = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
+    Соединение    = СоздатьСоединение(Сервер);
+    
+    Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
+    
+    Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+
+    Если ЭтоПереадресация(Ответ) Тогда  
+        Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"]
+            , Вид
+            , Данные
+            , ДопЗаголовки
+            , ПолныйОтвет
+            , ТипДанных);    
+    Иначе    
+        ОбработатьОтвет(Ответ, ПолныйОтвет);      
+    КонецЕсли;
+
+    Возврат Ответ;
+
+КонецФункции
+
+Функция ВыполнитьЗапросБезТела(Знач URL
+    , Знач Вид
+    , Знач Параметры = ""
+    , Знач ДопЗаголовки = ""
+    , Знач ФайлОтвета = Неопределено)
+    
+    Если Не ЗначениеЗаполнено(Параметры) Тогда
+        Параметры = Новый Структура;
+    КонецЕсли;
+
+    СтруктураURL        = РазбитьURL(URL);
+    Сервер              = СтруктураURL["Сервер"];
+    Адрес               = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры);
+    
+    Запрос     = СоздатьЗапрос(Адрес, ДопЗаголовки);
+    Соединение = СоздатьСоединение(Сервер);  
+     
+    Если ЗначениеЗаполнено(ФайлОтвета) Тогда
+        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
+    Иначе
+        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+    КонецЕсли;
+      
+    Если ЭтоПереадресация(Ответ) Тогда  
+        Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета);    
+    Иначе    
+        ОбработатьОтвет(Ответ);      
+    КонецЕсли;
+
+    Возврат Ответ;
+    
+КонецФункции
+
+Функция ВыполнитьЗапросМультипарт(Знач URL
+    , Знач Вид
+    , Знач Параметры = ""
+    , Знач Файлы = ""
+    , Знач ТипКонтента = "image/jpeg"
+    , Знач ДопЗаголовки = ""
+    , Знач ФайлОтвета = Неопределено)
+    
+    Если Не ЗначениеЗаполнено(Параметры) Тогда
+        Параметры = Новый Структура;
+    КонецЕсли;
+
+    Если Не ЗначениеЗаполнено(Файлы) Тогда
+        Файлы = Новый Соответствие;
+    КонецЕсли;
+
+    Переадресация    = 300;
+    Ошибка           = 400;
+    Boundary         = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
+    РазделительСтрок = Символы.ВК + Символы.ПС;
+    ТипДанных        = "multipart/form-data; boundary=" + Boundary;
+    СтруктураURL     = РазбитьURL(URL);
+    Сервер           = СтруктураURL["Сервер"];
+    Адрес            = СтруктураURL["Адрес"];
+    
+    Запрос        = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
+    Соединение    = СоздатьСоединение(Сервер);
+    
+    ТелоЗапроса  = ПолучитьИмяВременногоФайла();
+    ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
+        , КодировкаТекста.UTF8
+        , ПорядокБайтов.LittleEndian
+        , ""
+        , Ложь
+        , ""
+        , Ложь);
+
+    ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
+    ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
+    
+    ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
+    ЗаписьТекста.Закрыть();
+
+    Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
+    
+    Если ЗначениеЗаполнено(ФайлОтвета) Тогда
+        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
+    Иначе
+        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+    КонецЕсли;
+        
+    ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
+   
+    Если ЭтоПереадресация Тогда  
+        Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"]
+            , Вид
+            , Параметры
+            , Файлы
+            , ТипКонтента
+            , ДопЗаголовки
+            , ФайлОтвета);    
+    Иначе    
+        ОбработатьОтвет(Ответ);      
+    КонецЕсли;
+    
+    Запрос       = Неопределено;
+    ЗаписьТекста = Неопределено;
+    
+    УдалитьФайлы(ТелоЗапроса);
+    Возврат Ответ;
+       
+КонецФункции
+
+Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL
+    , Знач Вид
+    , Знач JSON = ""
+    , Знач Файлы = ""
+    , Знач ДопЗаголовки = ""
+    , Знач ФайлОтвета = Неопределено) 
+    
+    Переадресация    = 300;
+    Ошибка           = 400;
+    Boundary         = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
+    РазделительСтрок = Символы.ВК + Символы.ПС;
+    ТипДанных        = "multipart/related; boundary=" + Boundary;
+    СтруктураURL     = РазбитьURL(URL);
+    Сервер           = СтруктураURL["Сервер"];
+    Адрес            = СтруктураURL["Адрес"];
+    
+    Запрос        = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
+    Соединение    = СоздатьСоединение(Сервер);
+    
+    ТелоЗапроса  = ПолучитьИмяВременногоФайла();
+    ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
+        , КодировкаТекста.UTF8
+        , ПорядокБайтов.LittleEndian
+        , ""
+        , Ложь
+        , ""
+        , Ложь);
+    
+    ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
+    ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);        
+    
+    ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
+    ЗаписьТекста.Закрыть();
+    
+    ДобавитьContentLength(Запрос);
+    
+    Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
+    
+    Если ЗначениеЗаполнено(ФайлОтвета) Тогда
+        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
+    Иначе
+        Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+    КонецЕсли;
+        
+    ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
+    
+    Если ЭтоПереадресация Тогда  
+        Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"]
+            , Вид
+            , JSON
+            , Файлы
+            , ДопЗаголовки
+            , ФайлОтвета);    
+    Иначе    
+        ОбработатьОтвет(Ответ);      
+    КонецЕсли;
+    
+    Запрос       = Неопределено;
+    ЗаписьТекста = Неопределено;
+
+    УдалитьФайлы(ТелоЗапроса);
+    Возврат Ответ;
+
+КонецФункции
+
+Функция ЭтоПереадресация(Знач Ответ)
+    
+    Переадресация  = 300;
+    Ошибка         = 400;
+
+    ЭтоПереадресация = Ответ.КодСостояния >= Переадресация 
+        И Ответ.КодСостояния < Ошибка
+        И ЗначениеЗаполнено(Ответ.Заголовки["Location"]);
+    
+    Возврат ЭтоПереадресация;
+    
+КонецФункции
+
+Функция ПреобразоватьПараметрВСтроку(Знач Значение)
+
+    Если ТипЗнч(Значение) = Тип("Массив") Тогда
+        Значение = СтрСоединить(Значение, ",");
+        Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
+        Значение = "[" + Значение + "]"; 
+    Иначе
+        Значение = ЧислоВСтроку(Значение);
+        Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
+    КонецЕсли;
+    
+    Возврат Значение;
+    
+КонецФункции
+
+Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON)
+    
+    Коллекция = ТипЗнч(Параметры) = Тип("Структура") 
+        Или ТипЗнч(Параметры) = Тип("Соответствие")
+        Или ТипЗнч(Параметры) = Тип("Массив");
+        
+    Если JSON Тогда
+        Данные           = JSONСтрокой(Параметры);
+    ИначеЕсли Не Коллекция Тогда
+        Данные = Параметры;
+    Иначе
+        СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
+        Данные           = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
+    КонецЕсли;
+    
+    Если ТипЗнч(Данные) = Тип("Строка") Тогда
+        Запрос.УстановитьТелоИзСтроки(Данные);
+    Иначе
+        //@skip-check wrong-type-expression
+        Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
+    КонецЕсли;
+    
+КонецПроцедуры
+
+Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры)
+    
+    РазделительСтрок = Символы.ВК + Символы.ПС;
+    
+    Для Каждого Параметр Из Параметры Цикл
+        
+        Если Параметр.Значение = Неопределено
+            Или Параметр.Значение = NULL Тогда
+            Продолжить;
+        КонецЕсли;
+        
+        ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
+        ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """");
+        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+        
+        Если ТипЗнч(Параметр.Значение) = Тип("Строка") 
+            Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда
+            
+            ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение);
+            ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой);
+            
+        ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда
+            
+            ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false"));
+            
+        Иначе
+            
+            ЗаписьТекста.Записать(Параметр.Значение);
+            
+        КонецЕсли;
+        
+        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+        
+    КонецЦикла;
+    
+КонецПроцедуры
+
+Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы)
+    
+    ТипКонтента      = СокрЛП(ТипКонтента);
+    РазделительСтрок = Символы.ВК + Символы.ПС;
+    ЗаменаТочки      = "___";
+    
+    Для Каждого Файл Из Файлы Цикл
+        
+        ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
+        
+        Если ТипКонтента = "image/jpeg" Тогда
+            ИмяФайлаОтправки = "photo";
+        Иначе
+            ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
+            ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1);
+            ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ,
+            ЗаменаТочки, "."));
+        КонецЕсли;
+        
+        ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
+        ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" 
+            + ИмяФайлаОтправки 
+            + """; filename=""" 
+            + ПутьФайл
+            + """");
+        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);      
+        
+        Если ЗначениеЗаполнено(ТипКонтента) Тогда
+            ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента);
+        КонецЕсли;
+        
+        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+        ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Значение);
+        ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+        
+    КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы)
+    
+    Если Не ЗначениеЗаполнено(Файлы) Тогда
+        Возврат;
+    КонецЕсли;
+    
+    РазделительСтрок = Символы.ВК + Символы.ПС;
+    
+    Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда
+        Для Каждого Файл Из Файлы Цикл
+            
+            ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
+            ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение);
+            ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+            ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+            ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Ключ);
+            ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+            ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+            
+        КонецЦикла;
+        
+    КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаписатьДвоичныеДанные(ЗаписьДанных, Знач ДвоичныеДанные)
+    
+    РазмерЧасти      = 268435456;
+    ПрочитанноБайт   = 0;
+    ТекущаяПозиция   = 0;
+    ОбщийРазмер      = ДвоичныеДанные.Размер();
+
+    Пока ПрочитанноБайт < ОбщийРазмер Цикл
+        
+        ЧтениеДанных     = Новый ЧтениеДанных(ДвоичныеДанные);
+        ПрочитанноБайт   = ЧтениеДанных.Пропустить(ТекущаяПозиция);
+        Результат        = ЧтениеДанных.Прочитать(РазмерЧасти);
+        ТекущиеДанные    = Результат.ПолучитьДвоичныеДанные();
+        РазмерТекущих    = ТекущиеДанные.Размер();
+        
+        Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
+            Прервать;
+        КонецЕсли;
+
+        ЗаписьДанных.Записать(ТекущиеДанные);
+        
+        ОсвободитьОбъект(ТекущиеДанные);
+        ВыполнитьСборкуМусора();
+
+        ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих;
+        
+    КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON)
+    
+    Если Не ЗначениеЗаполнено(JSON) Тогда
+        Возврат;
+    КонецЕсли;
+    
+    РазделительСтрок = Символы.ВК + Символы.ПС;
+    
+    ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
+    ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8");
+    ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+    ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+    ЗаписьТекста.ЗаписатьСтроку(JSON);
+    ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+    ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+
+КонецПроцедуры
+
+Процедура ДобавитьContentLength(Запрос)
+    
+    ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
+    
+    Если ЗначениеЗаполнено(ТелоЗапроса) Тогда
+        
+        Размер = ТелоЗапроса.Размер();
+        Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер));
+        
+    КонецЕсли;
+
+КонецПроцедуры
+
+Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция)
+    
+    Для Каждого ЭлементКоллекции Из Коллекция Цикл
+        
+        Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда
+            ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение);
+        КонецЕсли;
+        
+    КонецЦикла;
+    
+КонецПроцедуры
+
+Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция)
+    
+    Для Каждого ЭлементКоллекции Из Коллекция Цикл
+        
+        Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда
+            ВыходнаяКоллекция.Добавить(ЭлементКоллекции);
+        КонецЕсли;
+        
+    КонецЦикла;
+    
+КонецПроцедуры
+
+#Область GZip
+
+// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
+// Источник: https://github.com/vbondarevsky/Connector 
+
+// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
+//
+// Copyright 2017-2023 Vladimir Bondarevskiy
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+//
+//
+// URL:    https://github.com/vbondarevsky/Connector
+// e-mail: vbondarevsky@gmail.com
+// Версия: 2.4.8
+//
+// Требования: платформа 1С версии 8.3.10 и выше
+
+Функция РаспаковатьОтвет(Ответ)
+
+    Попытка
+        Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
+    Исключение
+        Возврат Ответ;
+    КонецПопытки;
+
+КонецФункции
+
+Функция ПрочитатьGZip(СжатыеДанные) Экспорт
+
+    РазмерПрефиксаGZip  = 10;
+    РазмерПостфиксаGZip = 8;
+    
+    РазмерДД  = ZipРазмерDD();
+    РазмерСДХ = ZipРазмерCDH();
+    РазмерЕСД = ZipРазмерEOCD();
+    РазмерЛФХ = ZipРазмерLFH();
+
+    ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
+    ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
+    РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
+
+    ПотокZip     = Новый ПотокВПамяти(РазмерЛФХ 
+       + РазмерСжатыхДанных 
+       + РазмерДД 
+       + РазмерСДХ 
+       + РазмерЕСД);
+       
+    ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
+    ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
+    ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
+
+    ЗаписьДанных.Закрыть();
+    ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
+
+    CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
+    РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
+    ЧтениеДанных.Закрыть();
+
+    ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
+    ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
+    ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
+    ЗаписьДанных.Закрыть();
+
+    Возврат ПрочитатьZip(ПотокZip);
+
+КонецФункции
+
+Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено)
+
+    Каталог   = ПолучитьИмяВременногоФайла();
+    ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
+    ИмяФайла  = ЧтениеZip.Элементы[0].Имя;
+    Попытка
+        ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
+    Исключение
+        // Игнорируем проверку целостности архива, просто читаем результат
+        ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+    КонецПопытки;
+    ЧтениеZip.Закрыть();
+
+    Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
+    УдалитьФайлы(Каталог);
+
+    Возврат Результат;
+
+КонецФункции
+
+Функция ZipРазмерLFH()
+
+    Возврат 34;
+
+КонецФункции
+
+Функция ZipРазмерDD()
+
+    Возврат 16;
+
+КонецФункции
+
+Функция ZipРазмерCDH()
+
+    Возврат 50;
+
+КонецФункции
+
+Функция ZipРазмерEOCD()
+
+    Возврат 22;
+
+КонецФункции
+
+Функция ZipLFH()
+    
+    // Local file header
+    Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH());
+    Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50
+    Буфер.ЗаписатьЦелое16(4, 20);       // version
+    Буфер.ЗаписатьЦелое16(6, 10);       // bit flags    
+    Буфер.ЗаписатьЦелое16(8, 8);        // compression method
+    Буфер.ЗаписатьЦелое16(10, 0);       // time
+    Буфер.ЗаписатьЦелое16(12, 0);       // date
+    Буфер.ЗаписатьЦелое32(14, 0);       // crc-32
+    Буфер.ЗаписатьЦелое32(18, 0);       // compressed size
+    Буфер.ЗаписатьЦелое32(22, 0);       // uncompressed size
+    Буфер.ЗаписатьЦелое16(26, 4);       // filename legth - "data"
+    Буфер.ЗаписатьЦелое16(28, 0);       // extra field length
+    Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
+
+    Возврат Буфер;
+
+КонецФункции
+
+Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
+    
+    // Data descriptor
+    Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD());
+    Буфер.ЗаписатьЦелое32(0, 134695760);
+    Буфер.ЗаписатьЦелое32(4, CRC32);
+    Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных);
+    Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных);
+
+    Возврат Буфер;
+
+КонецФункции
+
+Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
+    
+    // Central directory header
+    Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH());
+    Буфер.ЗаписатьЦелое32(0, 33639248);              // signature 0x02014b50
+    Буфер.ЗаписатьЦелое16(4, 798);                   // version made by
+    Буфер.ЗаписатьЦелое16(6, 20);                    // version needed to extract
+    Буфер.ЗаписатьЦелое16(8, 10);                    // bit flags
+    Буфер.ЗаписатьЦелое16(10, 8);                    // compression method
+    Буфер.ЗаписатьЦелое16(12, 0);                    // time
+    Буфер.ЗаписатьЦелое16(14, 0);                    // date
+    Буфер.ЗаписатьЦелое32(16, CRC32);                // crc-32
+    Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных);   // compressed size
+    Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size
+    Буфер.ЗаписатьЦелое16(28, 4);                    // file name length
+    Буфер.ЗаписатьЦелое16(30, 0);                    // extra field length
+    Буфер.ЗаписатьЦелое16(32, 0);                    // file comment length
+    Буфер.ЗаписатьЦелое16(34, 0);                    // disk number start
+    Буфер.ЗаписатьЦелое16(36, 0);                    // internal file attributes
+    Буфер.ЗаписатьЦелое32(38, 2176057344);           // external file attributes
+    Буфер.ЗаписатьЦелое32(42, 0);                    // relative offset of local header
+    Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
+
+    Возврат Буфер;
+
+КонецФункции
+
+Функция ZipEOCD(РазмерСжатыхДанных)
+    
+    // End of central directory
+    РазмерCDH = 50;
+    Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD());
+    Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50
+    Буфер.ЗаписатьЦелое16(4, 0); // number of this disk
+    Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory
+    Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk
+    Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory
+    Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory    
+    // offset of start of central directory with respect to the starting disk number
+    Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD());
+    Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number
+
+    Возврат Буфер;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os b/src/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os
similarity index 97%
rename from ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os
rename to src/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os
index 0c2132b95c..57f73e85f9 100644
--- a/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os
+++ b/src/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os
@@ -1,110 +1,110 @@
-// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UnusedLocalVariable-off
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-#Область БСП
-
-///////////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2019, ООО 1С-Софт
-// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
-// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
-// Текст лицензии доступен по ссылке:
-// https://creativecommons.org/licenses/by/4.0/legalcode
-///////////////////////////////////////////////////////////////////////////////////////////////////////
-
-Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
-    
-    Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
-    
-КонецФункции
-
-Функция Хеш(ДвоичныеДанные, Тип) Экспорт
-    
-    Хеширование = Новый ХешированиеДанных(Тип);
-    Хеширование.Добавить(ДвоичныеДанные);
-    
-    Возврат Хеширование.ХешСумма;
-        
-КонецФункции
-
-Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
-    
-    Дважды = 2;
-    
-    Если Ключ.Размер() > РазмерБлока Тогда
-        Ключ = Хеш(Ключ, Тип);
-    КонецЕсли;
-    
-    Если Ключ.Размер() <= РазмерБлока Тогда
-        Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
-        Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
-    КонецЕсли;
-    
-    Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
-    
-    Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
-    Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
-    
-    Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
-    Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
-    
-    Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
-    Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
-    
-    Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
-    
-КонецФункции
-
-Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт
-    
-    МассивДвоичныхДанных = Новый Массив;
-    МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
-    МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
-    
-    Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
-    
-КонецФункции
-
-Функция ПовторитьСтроку(Строка, Количество) Экспорт
-    
-    Части = Новый Массив(Количество);
-    
-    Для К = 1 По Количество Цикл
-        Части.Добавить(Строка);
-    КонецЦикла;
-
-    Возврат СтрСоединить(Части, "");
-    
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
+// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UnusedLocalVariable-off
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+#Область БСП
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2019, ООО 1С-Софт
+// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
+// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
+// Текст лицензии доступен по ссылке:
+// https://creativecommons.org/licenses/by/4.0/legalcode
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
+    
+    Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
+    
+КонецФункции
+
+Функция Хеш(ДвоичныеДанные, Тип) Экспорт
+    
+    Хеширование = Новый ХешированиеДанных(Тип);
+    Хеширование.Добавить(ДвоичныеДанные);
+    
+    Возврат Хеширование.ХешСумма;
+        
+КонецФункции
+
+Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
+    
+    Дважды = 2;
+    
+    Если Ключ.Размер() > РазмерБлока Тогда
+        Ключ = Хеш(Ключ, Тип);
+    КонецЕсли;
+    
+    Если Ключ.Размер() <= РазмерБлока Тогда
+        Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
+        Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
+    КонецЕсли;
+    
+    Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
+    
+    Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
+    Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
+    
+    Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
+    Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
+    
+    Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
+    Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
+    
+    Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
+    
+КонецФункции
+
+Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт
+    
+    МассивДвоичныхДанных = Новый Массив;
+    МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
+    МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
+    
+    Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
+    
+КонецФункции
+
+Функция ПовторитьСтроку(Строка, Количество) Экспорт
+    
+    Части = Новый Массив(Количество);
+    
+    Для К = 1 По Количество Цикл
+        Части.Добавить(Строка);
+    КонецЦикла;
+
+    Возврат СтрСоединить(Части, "");
+    
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/ru/OPI/.project b/src/ru/OPI/.project
similarity index 100%
rename from ru/OPI/.project
rename to src/ru/OPI/.project
diff --git a/ru/OPI/.settings/org.eclipse.core.resources.prefs b/src/ru/OPI/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from ru/OPI/.settings/org.eclipse.core.resources.prefs
rename to src/ru/OPI/.settings/org.eclipse.core.resources.prefs
diff --git a/ru/OPI/DT-INF/PROJECT.PMF b/src/ru/OPI/DT-INF/PROJECT.PMF
similarity index 100%
rename from ru/OPI/DT-INF/PROJECT.PMF
rename to src/ru/OPI/DT-INF/PROJECT.PMF
diff --git a/ru/OPI/src/CommonModules/OPI_Airtable/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Airtable/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Airtable/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Airtable/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo b/src/ru/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Dropbox/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo b/src/ru/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo b/src/ru/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
rename to src/ru/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo b/src/ru/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
rename to src/ru/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo b/src/ru/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
rename to src/ru/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo b/src/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
rename to src/ru/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Notion/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Notion/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Notion/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Notion/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo b/src/ru/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Slack/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Slack/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Slack/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Slack/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo b/src/ru/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Telegram/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Telegram/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Telegram/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo b/src/ru/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Twitter/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Twitter/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Twitter/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Twitter/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo b/src/ru/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_VK/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_VK/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_VK/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_VK/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo b/src/ru/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
rename to src/ru/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Viber/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Viber/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Viber/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Viber/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo b/src/ru/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo b/src/ru/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
rename to src/ru/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_YandexID/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_YandexID/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_YandexID/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_YandexID/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo b/src/ru/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
rename to src/ru/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo b/src/ru/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Криптография/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Криптография/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Криптография/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Криптография/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo b/src/ru/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo b/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo
rename to src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo b/src/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo
rename to src/ru/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo
diff --git a/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl
rename to src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl
diff --git a/ru/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo b/src/ru/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
similarity index 100%
rename from ru/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
rename to src/ru/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
diff --git a/ru/OPI/src/Configuration/Configuration.mdo b/src/ru/OPI/src/Configuration/Configuration.mdo
similarity index 100%
rename from ru/OPI/src/Configuration/Configuration.mdo
rename to src/ru/OPI/src/Configuration/Configuration.mdo
diff --git a/ru/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi b/src/ru/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
similarity index 100%
rename from ru/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
rename to src/ru/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
diff --git a/ru/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo b/src/ru/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
similarity index 100%
rename from ru/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
rename to src/ru/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
diff --git a/ru/cli/core/Classes/Приложение.os b/src/ru/cli/core/Classes/Приложение.os
similarity index 100%
rename from ru/cli/core/Classes/Приложение.os
rename to src/ru/cli/core/Classes/Приложение.os
diff --git a/ru/cli/data/Classes/internal/Classes/airtable.os b/src/ru/cli/data/Classes/internal/Classes/airtable.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/airtable.os
rename to src/ru/cli/data/Classes/internal/Classes/airtable.os
diff --git a/ru/cli/data/Classes/internal/Classes/dropbox.os b/src/ru/cli/data/Classes/internal/Classes/dropbox.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/dropbox.os
rename to src/ru/cli/data/Classes/internal/Classes/dropbox.os
diff --git a/ru/cli/data/Classes/internal/Classes/gcalendar.os b/src/ru/cli/data/Classes/internal/Classes/gcalendar.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/gcalendar.os
rename to src/ru/cli/data/Classes/internal/Classes/gcalendar.os
diff --git a/ru/cli/data/Classes/internal/Classes/gdrive.os b/src/ru/cli/data/Classes/internal/Classes/gdrive.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/gdrive.os
rename to src/ru/cli/data/Classes/internal/Classes/gdrive.os
diff --git a/ru/cli/data/Classes/internal/Classes/google.os b/src/ru/cli/data/Classes/internal/Classes/google.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/google.os
rename to src/ru/cli/data/Classes/internal/Classes/google.os
diff --git a/ru/cli/data/Classes/internal/Classes/gsheets.os b/src/ru/cli/data/Classes/internal/Classes/gsheets.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/gsheets.os
rename to src/ru/cli/data/Classes/internal/Classes/gsheets.os
diff --git a/ru/cli/data/Classes/internal/Classes/notion.os b/src/ru/cli/data/Classes/internal/Classes/notion.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/notion.os
rename to src/ru/cli/data/Classes/internal/Classes/notion.os
diff --git a/ru/cli/data/Classes/internal/Classes/slack.os b/src/ru/cli/data/Classes/internal/Classes/slack.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/slack.os
rename to src/ru/cli/data/Classes/internal/Classes/slack.os
diff --git a/ru/cli/data/Classes/internal/Classes/telegram.os b/src/ru/cli/data/Classes/internal/Classes/telegram.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/telegram.os
rename to src/ru/cli/data/Classes/internal/Classes/telegram.os
diff --git a/ru/cli/data/Classes/internal/Classes/tools.os b/src/ru/cli/data/Classes/internal/Classes/tools.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/tools.os
rename to src/ru/cli/data/Classes/internal/Classes/tools.os
diff --git a/ru/cli/data/Classes/internal/Classes/twitter.os b/src/ru/cli/data/Classes/internal/Classes/twitter.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/twitter.os
rename to src/ru/cli/data/Classes/internal/Classes/twitter.os
diff --git a/ru/cli/data/Classes/internal/Classes/viber.os b/src/ru/cli/data/Classes/internal/Classes/viber.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/viber.os
rename to src/ru/cli/data/Classes/internal/Classes/viber.os
diff --git a/ru/cli/data/Classes/internal/Classes/vk.os b/src/ru/cli/data/Classes/internal/Classes/vk.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/vk.os
rename to src/ru/cli/data/Classes/internal/Classes/vk.os
diff --git a/ru/cli/data/Classes/internal/Classes/yadisk.os b/src/ru/cli/data/Classes/internal/Classes/yadisk.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/yadisk.os
rename to src/ru/cli/data/Classes/internal/Classes/yadisk.os
diff --git a/ru/cli/data/Classes/internal/Classes/yandex.os b/src/ru/cli/data/Classes/internal/Classes/yandex.os
similarity index 100%
rename from ru/cli/data/Classes/internal/Classes/yandex.os
rename to src/ru/cli/data/Classes/internal/Classes/yandex.os
diff --git a/ru/cli/data/Classes/СоставБиблиотеки.os b/src/ru/cli/data/Classes/СоставБиблиотеки.os
similarity index 100%
rename from ru/cli/data/Classes/СоставБиблиотеки.os
rename to src/ru/cli/data/Classes/СоставБиблиотеки.os
diff --git a/ru/cli/help/Modules/Справка.os b/src/ru/cli/help/Modules/Справка.os
similarity index 100%
rename from ru/cli/help/Modules/Справка.os
rename to src/ru/cli/help/Modules/Справка.os
diff --git a/ru/cli/start.bat b/src/ru/cli/start.bat
similarity index 100%
rename from ru/cli/start.bat
rename to src/ru/cli/start.bat
diff --git a/ru/cli/tools/Modules/Утилиты.os b/src/ru/cli/tools/Modules/Утилиты.os
similarity index 100%
rename from ru/cli/tools/Modules/Утилиты.os
rename to src/ru/cli/tools/Modules/Утилиты.os