1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-06-04 23:37:46 +02:00

en локализация

This commit is contained in:
Anton 2024-05-31 22:19:13 +03:00
parent b9c111b93a
commit b47569207d
30 changed files with 14967 additions and 14165 deletions

View File

@ -150,32 +150,37 @@
Если Цельный Тогда Если Цельный Тогда
ДобавитьСлово(СписокСлов, Элемент); ДобавитьСлово(СписокСлов, Элемент);
Иначе Иначе
РазобратьОбычнуюСтроку(Элемент, СписокСлов);
Для Каждого Символ Из МассивСимволов Цикл
Элемент = СтрЗаменить(Элемент, Символ, "$");
КонецЦикла;
Пока СтрНайти(Элемент, "$$") <> 0 Цикл
Элемент = СтрЗаменить(Элемент, "$$", "$");
КонецЦикла;
МассивЭлемента = СтрРазделить(Элемент, "$", Ложь);
Для Каждого Дробный Из МассивЭлемента Цикл
ДобавитьСлово(СписокСлов, Дробный);
КонецЦикла;
КонецЕсли; КонецЕсли;
Цельный = Не Цельный; Цельный = Не Цельный;
КонецЦикла; КонецЦикла;
Иначе
РазобратьОбычнуюСтроку(ТекущаяСтрока, СписокСлов);
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
КонецПроцедуры КонецПроцедуры
Процедура РазобратьОбычнуюСтроку(Элемент, СписокСлов)
Для Каждого Символ Из МассивСимволов Цикл
Элемент = СтрЗаменить(Элемент, Символ, "$");
КонецЦикла;
Пока СтрНайти(Элемент, "$$") <> 0 Цикл
Элемент = СтрЗаменить(Элемент, "$$", "$");
КонецЦикла;
МассивЭлемента = СтрРазделить(Элемент, "$", Ложь);
Для Каждого Дробный Из МассивЭлемента Цикл
ДобавитьСлово(СписокСлов, Дробный);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьСлово(Список, Слово) Процедура ДобавитьСлово(Список, Слово)
Слово = СокрЛП(Слово); Слово = СокрЛП(Слово);

View File

@ -1,13 +1,141 @@
Перем ТаблицаСловаря;
Процедура СоздатьЛокализацию(Знач Язык) Процедура ПриСозданииОбъекта()
КаталогСловарей = "./service/dictionaries";
ФайлыСловарей = НайтиФайлы(КаталогСловарей, "*.json");
ТаблицаСловаря = Новый ТаблицаЗначений();
ТаблицаСловаря.Колонки.Добавить("Ключ");
ТаблицаСловаря.Колонки.Добавить("Значение");
ТаблицаСловаря.Колонки.Добавить("Длина");
ТаблицаСловаря.Колонки.Добавить("ИмяМодуля");
Для Каждого Словарь Из ФайлыСловарей Цикл
СоздатьЛокализацию(Словарь);
КонецЦикла;
КонецПроцедуры
Процедура СоздатьЛокализацию(Знач Словарь)
ПутьКСловарю = Словарь.ПолноеИмя;
Язык = Словарь.ИмяБезРасширения;
ПолучитьТаблицуСловаря(ПутьКСловарю);
КаталогИсточник = Новый Файл(".\ru\OPI"); КаталогИсточник = Новый Файл(".\ru\OPI");
КаталогПриемник = Новый Файл(".\" + Язык + "\OPI"); КаталогПриемник = Новый Файл(".\" + Язык + "\OPI");
Если КаталогПриемник.Существует() Тогда
УдалитьФайлы(КаталогПриемник.ПолноеИмя);
КонецЕсли;
СкопироватьФайлы(КаталогИсточник.ПолноеИмя, КаталогПриемник.ПолноеИмя); СкопироватьФайлы(КаталогИсточник.ПолноеИмя, КаталогПриемник.ПолноеИмя);
ФайлыМодулей = НайтиФайлы("./" + Язык + "/", "*.bsl", Истина); ФайлыМодулей = НайтиФайлы("./" + Язык + "/", "*.bsl", Истина);
Для Каждого ФайлМодуля Из ФайлыМодулей Цикл
ПеревестиМодуль(ФайлМодуля.ПолноеИмя);
КонецЦикла;
ВсеФайлыЛокализации = НайтиФайлы("./" + Язык, "*", Истина);
ОтборИменМодулей = Новый Структура("ИмяМодуля", Истина);
СтрокиИмен = ТаблицаСловаря.НайтиСтроки(ОтборИменМодулей);
УдаляемыеКаталоги = Новый Массив;
Для Каждого ФайлЛокализации Из ВсеФайлыЛокализации Цикл
Если Не ФайлЛокализации.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
ТекущийПуть = ФайлЛокализации.ПолноеИмя;
НовыйПуть = ТекущийПуть;
Для Каждого Имя Из СтрокиИмен Цикл
НовыйПуть = СтрЗаменить(НовыйПуть, Имя.Ключ, Имя.Значение);
КонецЦикла;
ФайлНовогоПути = Новый Файл(НовыйПуть);
Если Не ФайлНовогоПути.Существует() Тогда
УдаляемыеКаталоги.Добавить(ТекущийПуть);
СоздатьКаталог(НовыйПуть);
КонецЕсли;
КонецЦикла;
Для Каждого ФайлЛокализации Из ВсеФайлыЛокализации Цикл
Если ФайлЛокализации.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
ТекущийПуть = ФайлЛокализации.ПолноеИмя;
НовыйПуть = ТекущийПуть;
Для Каждого Имя Из СтрокиИмен Цикл
НовыйПуть = СтрЗаменить(НовыйПуть, Имя.Ключ, Имя.Значение);
КонецЦикла;
ФайлНовогоПути = Новый Файл(НовыйПуть);
Если Не ФайлНовогоПути.Существует() Тогда
ПереместитьФайл(ТекущийПуть, НовыйПуть);
КонецЕсли;
КонецЦикла;
Для Каждого Каталог Из УдаляемыеКаталоги Цикл
УдалитьФайлы(Каталог);
КонецЦикла;
КонецПроцедуры
Процедура ПеревестиМодуль(ПутьКМодулю)
ДокументМодуля = Новый ТекстовыйДокумент();
ДокументМодуля.Прочитать(ПутьКМодулю, "UTF-8");
ТекстМодуля = ДокументМодуля.ПолучитьТекст();
Для Каждого Элемент Из ТаблицаСловаря Цикл
ТекущееЗначение = Элемент.Значение;
Пока СтрДлина(ТекущееЗначение) < Элемент.Длина Цикл
ТекущееЗначение = ТекущееЗначение + " ";
КонецЦикла;
ТекстМодуля = СтрЗаменить(ТекстМодуля, Элемент.Ключ, Элемент.Значение);
КонецЦикла;
ДокументМодуля.УстановитьТекст(ТекстМодуля);
ДокументМодуля.Записать(ПутьКМодулю);
КонецПроцедуры
Процедура ПолучитьТаблицуСловаря(ПутьКСловарю)
ТаблицаСловаря.Очистить();
ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.ОткрытьФайл(ПутьКСловарю);
ДанныеСловаря = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
Для Каждого Элемент Из ДанныеСловаря Цикл
НоваяСтрокаСловаря = ТаблицаСловаря.Добавить();
НоваяСтрокаСловаря.Ключ = Элемент.Ключ;
НоваяСтрокаСловаря.Значение = Элемент.Значение;
НоваяСтрокаСловаря.Длина = СтрДлина(Элемент.Ключ);
НоваяСтрокаСловаря.ИмяМодуля = СтрНайти(Элемент.Ключ, "OPI_") <> 0;
КонецЦикла;
ТаблицаСловаря.Сортировать("Длина УБЫВ");
КонецПроцедуры КонецПроцедуры
Процедура СкопироватьФайлы(Знач КаталогИсточник, Знач КаталогПриемник) Процедура СкопироватьФайлы(Знач КаталогИсточник, Знач КаталогПриемник)
@ -34,4 +162,6 @@
КонецЕсли; КонецЕсли;
КонецЦикла; КонецЦикла;
КонецПроцедуры КонецПроцедуры
ПриСозданииОбъекта();

File diff suppressed because it is too large Load Diff

View File

@ -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 by Quantity Loop
Parts.Add(String);
EndOfLoop;
Return StrJoin(Parts, "");
EndFunction
#EndRegion
#EndRegion

File diff suppressed because it is too large Load Diff

View File

@ -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
Attempt
Module = GetCommonModule("UTest");
Awaiting = TypeValue(Module) = Type("CommonModule");
Return Module.ExpectsThat(Value);
Exception
Return Awaiting.What(Value);
EndOfAttempt;
EndFunction
Function FormYAXTests() Export
Module = GetCommonModule("UTTests");
Sections = GetTestingSectionMapping();
TestTable = GetTestTable();
For Each Section Of Sections Loop
CurrentSection = Section.Key;
Filter = New Structure("Section", CurrentSection);
SectionTests = TestTable.FindLines(Filter);
Set = Module.AddTestSet(CurrentSection);
For Each Test Of SectionTests Loop
Set.AddServerTest(Test.Method, Test.Synonym);
EndOfLoop;
EndOfLoop;
Return "";
EndFunction
Function FormAssertsTests() Export
TestTable = GetTestTable();
ArrayOfTests = New Array;
For Each Test Of TestTable Loop
ArrayOfTests.Add(Test.Method);
EndOfLoop;
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);
Otherwise
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);
Otherwise
DeleteFiles(AndVF);
EndIf;
Otherwise
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;
Attempt
Data = OPI_Tools.JSONString(Result);
Exception
Data = "Not JSON: " + String(Result);
EndOfAttempt;
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 Of PossiblePaths Loop
RepositoryFile = New File(PossiblePath);
If RepositoryFile.Exists() Then
Path = PossiblePath;
EndIf;
EndOfLoop;
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)
Attempt
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;
Exception
Notify("Failed to write log file!: " + ErrorDescription());
EndOfAttempt;
EndProcedure
#EndRegion

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os // Location OS: ./OInt/core/Modules/OPI_GoogleSheets.os
// Библиотека: Google Sheets // Library: Google Sheets
// Команда CLI: gsheets // CLI Command: gsheets
// MIT License // MIT License
@ -29,381 +29,381 @@
// BSLLS:LatinAndCyrillicSymbolInWord-off // BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off // BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript // Uncomment if OneScript is executed
// #Использовать "../../tools" // #Use "../../tools"
#Область ПрограммныйИнтерфейс #Region ProgrammingInterface
#Область РаботаСКнигами #Region BookWork
// Создать книгу // CreateBook
// Создает новую книгу // Creates a new book
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Наименование - Строка - Наименование - title // Name - String - Name - title
// МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets // ArrayOfSheetNames - Array of Strings - Array of names to add new sheets to the book - sheets
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт Function CreateBook(Val Token, Val Name, Val ArrayOfSheetNames) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); OPI_TypeConversion.GetLine(Name);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов); OPI_TypeConversion.GetCollection(ArrayOfSheetNames);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets"; URL = "https://sheets.googleapis.com/v4/spreadsheets";
Свойства = Новый Структура("title" , Наименование); Properties = New Structure("title" , Name);
Листы = Новый Массив; Sheets = New Array;
ЗаполнитьМассивЛистов(МассивИменЛистов, Листы); FillSheetArray(ArrayOfSheetNames, Sheets);
Параметры = Новый Структура; Parameters = New Structure;
OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры); OPI_Tools.AddField("properties", Properties, "Collection", Parameters);
OPI_Инструменты.ДобавитьПоле("sheets" , Листы , "Коллекция", Параметры); OPI_Tools.AddField("sheets" , Sheets , "Collection", Parameters);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Response = OPI_Tools.Post(URL, Parameters, Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Получить книгу // GetBook
// Получает информацию о книге по ID // Gets information about the book by ID
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Идентификатор - Строка - Идентификатор книги - spreadsheet // Identifier - String - BookIdentifier - spreadsheet
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт Function GetBook(Val Token, Val Identifier) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); OPI_TypeConversion.GetLine(Identifier);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор; URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Identifier;
Ответ = OPI_Инструменты.Get(URL, , Заголовки); Response = OPI_Tools.Get(URL, , Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Изменить наименование книги // ChangeBookName
// Изменяет наименование существующей книги // Changes the name of the existing book
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Книга - Строка - ID книги - spreadsheet // Book - String - BookID - spreadsheet
// Наименование - Строка - Новое наименование - title // Name - String - New name - title
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт Function EditBookTitle(Val Token, Val Book, Val Name) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); OPI_TypeConversion.GetLine(Book);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); OPI_TypeConversion.GetLine(Name);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate";
Изменение = Новый Структура("title", Наименование); Change = New Structure("title", Name);
ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title"); ChangeRequest = New Structure("properties,fields", Change, "title");
Запрос = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения); Request = New Structure("updateSpreadsheetProperties", ChangeRequest);
МассивЗапросов = Новый Массив; ArrayOfRequests = New Array;
МассивЗапросов.Добавить(Запрос); ArrayOfRequests.Add(Request);
Параметры = Новый Структура("requests", МассивЗапросов); Parameters = New Structure("requests", ArrayOfRequests);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Response = OPI_Tools.Post(URL, Parameters, Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
#КонецОбласти #EndRegion
#Область РаботаСЛистами #Region SheetWork
// Добавить лист // AddSheet
// Добавляет новый лист в книгу // Adds a new sheet to the book
// //
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Книга - Строка - Идентификатор книги - spreadsheet // Book - String - BookIdentifier - spreadsheet
// Наименование - Строка - Наименование нового листа - title // Name - String - NewSheetName - title
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт Function AddSheet(Val Token, Val Book, Val Name) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); OPI_TypeConversion.GetLine(Book);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate";
Лист = СоздатьЛист(Наименование); Sheet = CreateSheet(Name);
Запросы = Новый Массив; Requests = New Array;
Изменение = Новый Структура("addSheet", Лист); Change = New Structure("addSheet", Sheet);
Запросы.Добавить(Изменение); Requests.Add(Change);
Параметры = Новый Структура("requests", Запросы); Parameters = New Structure("requests", Requests);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Response = OPI_Tools.Post(URL, Parameters, Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Удалить лист // DeleteSheet
// Удаляет лист из книги // Deletes a sheet from the book
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Книга - Строка - Идентификатор книги - spreadsheet // Book - String - BookIdentifier - spreadsheet
// Лист - Строка - Идентификатор удаляемого листа - sheet // Sheet - String - IdentifierOfSheetToDelete - sheet
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт Function DeleteSheet(Val Token, Val Book, Val Sheet) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); OPI_TypeConversion.GetLine(Book);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); OPI_TypeConversion.GetLine(Sheet);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate"; URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + ":batchUpdate";
Запросы = Новый Массив; Requests = New Array;
Лист = Новый Структура("sheetId" , Лист); Sheet = New Structure("sheetId" , Sheet);
Изменение = Новый Структура("deleteSheet", Лист); Change = New Structure("deleteSheet", Sheet);
Запросы.Добавить(Изменение); Requests.Add(Change);
Параметры = Новый Структура("requests", Запросы); Parameters = New Structure("requests", Requests);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Response = OPI_Tools.Post(URL, Parameters, Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Копировать лист // CopySheet
// Копирует лист из одной книги в другую // Copies a sheet from one book to another
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Откуда - Строка - ID книги источника - from // From - String - SourceBookID - from
// Куда - Строка - ID книги приемника - to // To - String - DestinationBookID - to
// Лист - Строка - ID копируемого листа - sheet // Sheet - String - CopiedSheetID - sheet
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт Function CopySheet(Val Token, Val From, Val To, Val Sheet) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда); OPI_TypeConversion.GetLine(From);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда); OPI_TypeConversion.GetLine(To);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); OPI_TypeConversion.GetLine(Sheet);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" URL = "https://sheets.googleapis.com/v4/spreadsheets/"
+ Откуда + From
+ "/sheets/" + "/sheets/"
+ Лист + Sheet
+ ":copyTo"; + ":copyTo";
Параметры = Новый Структура("destinationSpreadsheetId", Куда); Parameters = New Structure("destinationSpreadsheetId", To);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Response = OPI_Tools.Post(URL, Parameters, Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
#КонецОбласти #EndRegion
#Область РаботаСДанными #Region DataWork
// Установить значения ячеек // SetCellValues
// Устанавливает значения ячеек листа // Sets sheet cell values
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Книга - Строка - ID книги - spreadsheet // Book - String - BookID - spreadsheet
// СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1 - data // ValueMapping - Key-Value Pair - Fill data where the key is the cell name like A1 - data
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname // Sheet - String - Name лиwithта (перinый лиwithт по умолчанию) - sheetname
// ОсновноеИзмерение - Строка - Основное измерение при заполнении диапазона массивом - dim // MajorDimension - String - Main dimension when filling the array range - dim
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция УстановитьЗначенияЯчеек(Знач Токен Function SetCellValues(Val Token
, Знач Книга , Val Book
, Знач СоответствиеЗначений , Val ValueMapping
, Знач Лист = "" , Val Sheet = ""
, Знач ОсновноеИзмерение = "COLUMNS") Экспорт , Val MajorDimension = "COLUMNS") Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); OPI_TypeConversion.GetLine(Book);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений); 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;
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate"; URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchUpdate";
МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист); Data array = FormCellDataArray(ValueMapping, MajorDimension, Sheet);
Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED"); Parameters = New Structure("data,valueInputOption", Data array, "USER_ENTERED");
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Response = OPI_Tools.Post(URL, Parameters, Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Очистить ячейки // Clear cells
// Очищает значение в ячейках // Clears the value in cells
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Книга - Строка - ID книги - spreadsheet // Book - String - BookID - spreadsheet
// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки - cells // Cell array - Array of Strings - Array of cells like A1 to be cleared - cells
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname // Sheet - String - Name лиwithта (перinый лиwithт по умолчанию) - sheetname
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт Function ClearCells(Val Token, Val Book, Val Cell array, Val Sheet = "") Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); OPI_TypeConversion.GetLine(Book);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек); OPI_TypeConversion.GetCollection(Cell array);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear"; URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchClear";
СформироватьМассивИменЯчеек(МассивЯчеек, Лист); FormCellNameArray(Cell array, Sheet);
Параметры = Новый Структура("ranges", МассивЯчеек); Parameters = New Structure("ranges", Cell array);
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки); Response = OPI_Tools.Post(URL, Parameters, Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Получить значения ячеек // Get cell values
// Получает значения ячеек таблицы // Gets cell values of the table
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Книга - Строка - ID книги - spreadsheet // Book - String - BookID - spreadsheet
// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено) - cells // Cell array - Array of Strings - Array ячееto inиdа А1 for получения (inеwithь лиwithт, еwithли не заполнено) - cells
// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname // Sheet - String - Name лиwithта (перinый лиwithт по умолчанию) - sheetname
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт Function GetCellValues(Val Token, Val Book, Val Cell array = "", Val Sheet = "") Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга); OPI_TypeConversion.GetLine(Book);
Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен); Headers = OPI_GoogleWorkspace.GetAuthorizationHeader(Token);
URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet"; URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Book + "/values:batchGet";
Если ЗначениеЗаполнено(МассивЯчеек) Тогда If ValueFilled(Cell array) Then
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек); OPI_TypeConversion.GetCollection(Cell array);
СформироватьМассивИменЯчеек(МассивЯчеек, Лист); FormCellNameArray(Cell array, Sheet);
Первый = Истина; First = True;
Для Каждого Ячейка Из МассивЯчеек Цикл For Each Cell Of Cell array Loop
Разделитель = ?(Первый, "?", "&"); Delimiter = ?(First, "?", "&");
URL = URL + Разделитель + "ranges=" + Ячейка; URL = URL + Delimiter + "ranges=" + Cell;
Первый = Ложь; First = False;
КонецЦикла; EndOfLoop;
Иначе Otherwise
URL = URL + "?ranges='" + Лист + "'"; URL = URL + "?ranges='" + Sheet + "'";
КонецЕсли; EndIf;
Ответ = OPI_Инструменты.Get(URL, , Заголовки); Response = OPI_Tools.Get(URL, , Headers);
Возврат Ответ; Return Response;
КонецФункции EndFunction
#КонецОбласти #EndRegion
#КонецОбласти #EndRegion
#Область СлужебныеПроцедурыИФункции #Region ServiceProceduresAndFunctions
Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов) Procedure FillSheetArray(Val ArrayOfNames, SheetArray)
Для Каждого ИмяЛиста Из МассивИмен Цикл For Each SheetName Of ArrayOfNames Loop
Лист = СоздатьЛист(ИмяЛиста); Sheet = CreateSheet(SheetName);
МассивЛистов.Добавить(Лист); SheetArray.Add(Sheet);
КонецЦикла; EndOfLoop;
КонецПроцедуры EndProcedure
Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист) Procedure AddSheetName(Cell, Val Sheet)
Если ЗначениеЗаполнено(Лист) Тогда If ValueFilled(Sheet) Then
Ячейка = "'" + Лист + "'!" + Ячейка; Cell = "'" + Sheet + "'!" + Cell;
КонецЕсли; EndIf;
КонецПроцедуры EndProcedure
Функция СоздатьЛист(Знач Наименование) Function CreateSheet(Val Name)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование); OPI_TypeConversion.GetLine(Name);
СвойстваЛиста = Новый Структура("title" , Наименование); Sheet properties = New Structure("title" , Name);
Лист = Новый Структура("properties", СвойстваЛиста); Sheet = New Structure("properties", Sheet properties);
Возврат Лист; Return Sheet;
КонецФункции EndFunction
Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист) Function FormCellDataArray(Val ValueStructure, Val MajorDimension, Val Sheet)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); OPI_TypeConversion.GetLine(Sheet);
МассивДанных = Новый Массив; Data array = New Array;
Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл For Each CellData Of ValueStructure Loop
ТекущееЗначение = ДанныеЯчейки.Значение; CurrentValue = CellData.Value;
ТекущийКлюч = ДанныеЯчейки.Ключ; Current key = CellData.Key;
ДобавитьИмяЛиста(ТекущийКлюч, Лист); AddSheetName(Current key, Sheet);
OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение); OPI_TypeConversion.GetArray(CurrentValue);
ТекущиеДанные = Новый Соответствие; Current data = New Match;
ТекущийМассив = Новый Массив; Current array = New Array;
ТекущийМассив.Добавить(ТекущееЗначение); Current array.Add(CurrentValue);
OPI_Инструменты.ДобавитьПоле("range" , ТекущийКлюч , "Строка", ТекущиеДанные); OPI_Tools.AddField("range" , Current key , "String", Current data);
OPI_Инструменты.ДобавитьПоле("values" , ТекущийМассив , "Массив", ТекущиеДанные); OPI_Tools.AddField("values" , Current array , "Array", Current data);
OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные); OPI_Tools.AddField("majorDimension", MajorDimension, "String", Current data);
МассивДанных.Добавить(ТекущиеДанные); Data array.Add(Current data);
КонецЦикла; EndOfLoop;
Возврат МассивДанных; Return Data array;
КонецФункции EndFunction
Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист) Procedure FormCellNameArray(Val ArrayOfNames, Val Sheet)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист); OPI_TypeConversion.GetLine(Sheet);
Для Н = 0 По МассивИмен.ВГраница() Цикл For N = 0 by ArrayOfNames.WithinBoundary() Loop
ДобавитьИмяЛиста(МассивИмен[Н], Лист); AddSheetName(ArrayOfNames[N], Sheet);
КонецЦикла; EndOfLoop;
КонецПроцедуры EndProcedure
#КонецОбласти #EndRegion

View File

@ -1,6 +1,6 @@
// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os // Location OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os
// Библиотека: Google Workspace // Library: Google Workspace
// Команда CLI: google // CLI command: google
// MIT License // MIT License
@ -29,145 +29,145 @@
// BSLLS:LatinAndCyrillicSymbolInWord-off // BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off // BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript // Uncomment if OneScript is executed
// #Использовать "../../tools" // #Use "../../tools"
#Область ПрограммныйИнтерфейс #Region ProgrammingInterface
// Сформировать ссылку получения кода // Generate code retrieval link
// Возвращает URL для авторизации в браузере // Returns URL for browser authorization
// //
// Параметры: // Parameters:
// ClientID - Строка - Client ID - id // ClientID - String - Client ID - id
// Calendar - Булево - разрешение на методы Calendar - calendar // Calendar - Boolean - Calendar methods permission - calendar
// Drive - Булево - разрешение на методы Drive - drive // Drive - Boolean - Drive methods permission - drive
// Sheets - Булево - разрешение на методы Sheets - sheets // Sheets - Boolean - Sheets methods permission - sheets
// //
// Возвращаемое значение: // Return value:
// Строка - Ссылка получения кода // String - Code retrieval link
Функция СформироватьСсылкуПолученияКода(Знач ClientID Function FormCodeRetrievalLink(Val ClientID
, Знач Calendar = Истина , Val Calendar = True
, Знач Drive = Истина , Val Drive = True
, Знач Sheets = Истина) Экспорт , Val Sheets = True) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); OPI_TypeConversion.GetLine(ClientID);
OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar); OPI_TypeConversion.GetBoolean(Calendar);
OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets); OPI_TypeConversion.GetBoolean(Sheets);
OPI_ПреобразованиеТипов.ПолучитьБулево(Drive); OPI_TypeConversion.GetBoolean(Drive);
URL = "https://accounts.google.com/o/oauth2/auth"; URL = "https://accounts.google.com/o/oauth2/auth";
ПараметрыURL = Новый Структура; URLParameters = New Structure;
ПараметрыURL.Вставить("response_type", "code"); URLParameters.Insert("response_type", "code");
ПараметрыURL.Вставить("client_id" , ClientID); URLParameters.Insert("client_id" , ClientID);
ПараметрыURL.Вставить("redirect_uri" , "http://localhost"); URLParameters.Insert("redirect_uri" , "http://localhost");
ПараметрыURL.Вставить("access_type" , "offline"); URLParameters.Insert("access_type" , "offline");
ПараметрыURL.Вставить("scope" , ПолучитьСписокРазрешений(Calendar, Drive, Sheets)); URLParameters.Insert("scope" , GetPermissionsList(Calendar, Drive, Sheets));
URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL); URL = URL + OPI_Tools.RequestParametersToString(URLParameters);
Возврат URL; Return URL;
КонецФункции EndFunction
// Получить токен по коду // Get token by code
// Получает токен по коду из авторизации в бразуере // Gets token by code from browser authorization
// //
// Параметры: // Parameters:
// ClientID - Строка - Client ID - id // ClientID - String - Client ID - id
// ClientSecret - Строка - Client secret - secret // ClientSecret - String - Client secret - secret
// Code - Строка - Code из браузера - code // Code - String - Code from browser - code
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт Function GetTokenByCode(Val ClientID, Val ClientSecret, Val Code) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); OPI_TypeConversion.GetLine(ClientID);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); OPI_TypeConversion.GetLine(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Code); OPI_TypeConversion.GetLine(Code);
URL = "https://accounts.google.com/o/oauth2/token"; URL = "https://accounts.google.com/o/oauth2/token";
ПараметрыURL = Новый Структура; URLParameters = New Structure;
ПараметрыURL.Вставить("grant_type" , "authorization_code"); URLParameters.Insert("grant_type" , "authorization_code");
ПараметрыURL.Вставить("client_id" , ClientID); URLParameters.Insert("client_id" , ClientID);
ПараметрыURL.Вставить("client_secret", ClientSecret); URLParameters.Insert("client_secret", ClientSecret);
ПараметрыURL.Вставить("redirect_uri" , "http://localhost"); URLParameters.Insert("redirect_uri" , "http://localhost");
ПараметрыURL.Вставить("code" , Code); URLParameters.Insert("code" , Code);
Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь); Response = OPI_Tools.Post(URL, URLParameters, , False);
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Обновить токен // Refresh token
// Обновляет токен по Refresh token // Updates token by Refresh token
// //
// Параметры: // Parameters:
// ClientID - Строка - Client ID - id // ClientID - String - Client ID - id
// ClientSecret - Строка - Client secret - secret // ClientSecret - String - Client secret - secret
// RefreshToken - Строка - Refresh token - refresh // RefreshToken - String - Refresh token - refresh
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google // Key-Value Pair - serialized JSON response from Google
Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт Function RefreshToken(Val ClientID, Val ClientSecret, Val RefreshToken) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID); OPI_TypeConversion.GetLine(ClientID);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); OPI_TypeConversion.GetLine(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken); OPI_TypeConversion.GetLine(RefreshToken);
URL = "https://accounts.google.com/o/oauth2/token"; URL = "https://accounts.google.com/o/oauth2/token";
ПараметрыURL = Новый Структура; URLParameters = New Structure;
ПараметрыURL.Вставить("grant_type" , "refresh_token"); URLParameters.Insert("grant_type" , "refresh_token");
ПараметрыURL.Вставить("client_id" , ClientID); URLParameters.Insert("client_id" , ClientID);
ПараметрыURL.Вставить("client_secret", ClientSecret); URLParameters.Insert("client_secret", ClientSecret);
ПараметрыURL.Вставить("refresh_token", RefreshToken); URLParameters.Insert("refresh_token", RefreshToken);
Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь); Response = OPI_Tools.Post(URL, URLParameters, , False);
Возврат Ответ; Return Response;
КонецФункции EndFunction
#КонецОбласти #EndRegion
#Область СлужебныйПрограммныйИнтерфейс #Region ServiceProgramInterface
Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт Function GetAuthorizationHeader(Val Token) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_TypeConversion.GetLine(Token);
Заголовки = Новый Соответствие; Headers = New Match;
Заголовки.Вставить("Authorization", "Bearer " + Токен); Headers.Insert("Authorization", "Bearer " + Token);
Возврат Заголовки; Return Headers;
КонецФункции EndFunction
#КонецОбласти #EndRegion
#Область СлужебныеПроцедурыИфункции #Region ServiceProceduresAndFunctions
Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets) Function GetPermissionsList(Calendar, Drive, Sheets)
МассивРазрешений = Новый Массив; Permissions array = New Array;
Если Calendar Тогда If Calendar Then
МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar"); Permissions array.Add("https://www.googleapis.com/auth/calendar");
КонецЕсли; EndIf;
Если Drive Тогда If Drive Then
МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive"); Permissions array.Add("https://www.googleapis.com/auth/drive");
КонецЕсли; EndIf;
Если Sheets Тогда If Sheets Then
МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets"); Permissions array.Add("https://www.googleapis.com/auth/spreadsheets");
КонецЕсли; EndIf;
Возврат СтрСоединить(МассивРазрешений, " "); Return StrJoin(Permissions array, " ");
КонецФункции EndFunction
#КонецОбласти #EndRegion

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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;
Attempt
If TypeValue(Value) = Type("BinaryData") Then
Return;
Otherwise
File = New File(Value);
If File.Exists() Then
Value = New BinaryData(Value);
ElseIf StrFind(Value, "//") Then
Value = OPI_Tools.Get(Value);
Otherwise
Value = Base64Value(Value);
EndIf;
EndIf;
Exception
RaiseException "Error getting binary data from parameter: " + ErrorDescription();
EndOfAttempt;
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);
Otherwise
GetBinaryData(Value);
EndIf;
EndProcedure
Procedure GetCollection(Value) Export
If Value = Undefined Then
Return;
EndIf;
Attempt
InitialValue = Value;
If ThisIsCollection(Value) Then
Return;
Otherwise
If TypeValue(Value) = Type("BinaryData") Then
Value = GetStringFromBinaryData(Value);
Otherwise
Value = OPI_Tools.NumberToString(Value);
EndIf;
File = New File(Value);
ReadingJSON = New ReadingJSON;
If File.Exists() Then
ReadingJSON.OpenFile(Value);
ElseIf StringStartsWith(nReg(Value), "http") Then
AndVF = GetTempFileName();
CopyFile(Value, AndVF);
ReadingJSON.OpenFile(AndVF);
ReadingJSON.Read();
DeleteFiles(AndVF);
Otherwise
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;
Exception
Value = InitialValue;
GetArray(Value);
EndOfAttempt;
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 by Value.WithinBoundary() Loop
Value[N] = ShortLP(Value[N]);
EndOfLoop;
Otherwise
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;
Attempt
If TypeValue(Value) = Type("Boolean") Then
Return;
Otherwise
Value = Boolean(Value);
EndIf;
Exception
RaiseException "Error getting boolean data from parameter";
EndOfAttempt;
EndProcedure
Procedure GetLine(Value, Val FromSource = False) Export
If Value = Undefined Then
Return;
EndIf;
Attempt
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();
ElseIf StringStartsWith(nReg(Value), "http") Then
AndVF = GetTempFileName();
CopyFile(Value, AndVF);
ReadingText = New ReadingText(AndVF);
Value = ReadingText.Read();
ReadingText.Close();
DeleteFiles(AndVF);
Otherwise
Return;
EndIf;
ElseIf TypeValue(Value) = Type("BinaryData") Then
Value = GetStringFromBinaryData(Value);
ElseIf ThisIsCollection(Value) Then
Value = OPI_Tools.JSONString(Value);
Otherwise
Return;
EndIf;
Exception
Value = String(Value);
Return;
EndOfAttempt;
EndProcedure
Procedure GetDate(Value) Export
If Value = Undefined Then
Return;
EndIf;
Date = "Date";
Attempt
If TypeValue(Value) = Type(Date) Then
Return;
Otherwise
Value = XMLValue(Type(Date), Value);
EndIf;
Exception
OOD = New TypeDescription(Date);
Value = OOD.ConvertValue(Value);
EndOfAttempt;
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

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
// Расположение OS: ./OInt/core/Modules/OPI_Viber.os // Location OS: ./OInt/core/Modules/OPI_Viber.os
// Библиотека: Viber // Library: Viber
// Команда CLI: viber // CLI Command: viber
// MIT License // MIT License
@ -29,386 +29,386 @@
// BSLLS:LatinAndCyrillicSymbolInWord-off // BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off // BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript // Uncomment if OneScript is executed
// #Использовать "../../tools" // #Use "../../tools"
#Область ПрограммныйИнтерфейс #Region ProgrammingInterface
#Область НастройкиИИнформация #Region SettingsAndInformation
// Установить Webhook // Set Webhook
// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL, // InАЖNО: Уwithтаноintoа Webhook обязательto по праinилам Viber. For thisго todо иметь withinобоdный URL,
// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована // which will return 200 and a genuine SSL certificate. If there is a certificate and the database is published
// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях // on the server - you can use an HTTP service. Information about new messages will also be sent there
// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать // Viber periodically knocks on the Webhook address, so if it is inactive, everything will stop working
// //
// Параметры: // Parameters:
// Токен - Строка - Токен Viber - token // Token - String - Viber Token - token
// URL - Строка - URL для установки Webhook - url // URL - String - URL for setting up Webhook - url
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт Function SetWebhook(Val Token, Val URL) Export
Параметры = Новый Структура; Parameters = New Structure;
OPI_Инструменты.ДобавитьПоле("url" , URL , "Строка", Параметры); OPI_Tools.AddField("url" , URL , "String", Parameters);
OPI_Инструменты.ДобавитьПоле("auth_token" , Токен, "Строка", Параметры); OPI_Tools.AddField("auth_token" , Token, "String", Parameters);
Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры); Return OPI_Tools.Post("https://chatapi.viber.com/pa/set_webhook", Parameters);
КонецФункции EndFunction
// Получить информацию о канале // Get channel information
// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook // Here you can get the channel's user IDs. Bot IDs need to be obtained from the Webhook arrivals
// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные // The user ID from channel information is not suitable for sending messages through the bot - they are different
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт Function GetChannelInformation(Val Token) Export
URL = "https://chatapi.viber.com/pa/get_account_info"; URL = "https://chatapi.viber.com/pa/get_account_info";
Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен)); Return OPI_Tools.Get(URL, , TokenInHeaders(Token));
КонецФункции EndFunction
// Получить данные пользователя // Get user data
// Получает информацию о пользователе по ID // Gets user information by ID
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// IDПользователя - Строка, Число - ID пользователя Viber - user // UserID - String, Number - Viber User ID - user
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт Function GetUserData(Val Token, Val UserID) Export
URL = "https://chatapi.viber.com/pa/get_user_details"; URL = "https://chatapi.viber.com/pa/get_user_details";
Параметры = Новый Структура; Parameters = New Structure;
OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры); OPI_Tools.AddField("id", UserID, "String", Parameters);
Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен)); Response = OPI_Tools.Post(URL, Parameters, TokenInHeaders(Token));
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Получить онлайн пользователей // Get online users
// Получает статус пользователя или нескольких пользователей по ID // Gets the status of a user or several users by ID
// //
// Параметры: // Parameters:
// Токен - Строка - Токен Viber - token // Token - String - Viber Token - token
// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber - users // UserIDs - String,Number,Array of String,Number - Viber User(s) ID - users
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт Function GetOnlineUsers(Val Token, Val UserIDs) Export
URL = "https://chatapi.viber.com/pa/get_online"; URL = "https://chatapi.viber.com/pa/get_online";
Параметры = Новый Структура; Parameters = New Structure;
OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры); OPI_Tools.AddField("ids", UserIDs, "Collection", Parameters);
Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен)); 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 // Token - String - Token - token
// Текст - Строка - Текст сообщения - text // Text - String - Message text - text
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user // UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel // SendingToChannel - Boolean - Sending to channel or bot chat - ischannel
// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок - keyboard // Keyboard - Structure Of String - See CreateKeyboardFromArrayButton - keyboard
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ОтправитьТекстовоеСообщение(Знач Токен Function SendTextMessage(Val Token
, Знач Текст , Val Text
, Знач IDПользователя , Val UserID
, Знач ОтправкаВКанал , Val SendingToChannel
, Знач Клавиатура = "") Экспорт , Val Keyboard = "") Export
Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура); Return SendMessage(Token, "text", UserID, SendingToChannel, , Text, Keyboard);
КонецФункции EndFunction
// Отправить картинку // Send image
// Отправляет картинку в чат или канал // Sends an image to a chat or channel
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// URL - Строка - URL картинки - picture // URL - String - Image URL - picture
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user // UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user
// ОтправкаВКанал - булево - Отправка в канал или в чат бота - ischannel // SendingToChannel - boolean - Sending to channel or bot chat - ischannel
// Описание - Строка - Аннотация к картинке - description // Description - String - Image annotation - description
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт Function SendImage(Val Token, Val URL, Val UserID, Val SendingToChannel, Val Description = "") Export
Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание); Return SendMessage(Token, "picture", UserID, SendingToChannel, URL, Description);
КонецФункции EndFunction
// Отправить файл // SendFile
// Отправляет файл (документ) в чат или канал // Sends a file (document) to a chat or channel
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// URL - Строка - URL файла - file // URL - String - File URL - file
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user // UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel // SendingToChannel - Boolean - Sending to channel or bot chat - ischannel
// Расширение - Строка - Расширение файла - ext // Extension - String - File extension - ext
// Размер - Число - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size // Size - Number - File size. If not filled in > determined automatically by downloading the file - size
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ОтправитьФайл(Знач Токен Function SendFile(Val Token
, Знач URL , Val URL
, Знач IDПользователя , Val UserID
, Знач ОтправкаВКанал , Val SendingToChannel
, Знач Расширение , Val Extension
, Знач Размер = "") Экспорт , Val Size = "") Export
Если Не ЗначениеЗаполнено(Размер) Тогда If Not ValueFilled(Size) Then
Ответ = OPI_Инструменты.Get(URL); Response = OPI_Tools.Get(URL);
Размер = Ответ.Размер(); Size = Response.Size();
КонецЕсли; EndIf;
Строка_ = "Строка"; String_ = "String";
Расширение = СтрЗаменить(Расширение, ".", ""); Extension = StringReplace(Extension, ".", "");
Параметры = Новый Структура; Parameters = New Structure;
OPI_Инструменты.ДобавитьПоле("URL" , URL , Строка_, Параметры); OPI_Tools.AddField("URL" , URL , String_, Parameters);
OPI_Инструменты.ДобавитьПоле("Размер" , Размер , Строка_, Параметры); OPI_Tools.AddField("Size" , Size , String_, Parameters);
OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры); OPI_Tools.AddField("Extension", Extension, String_, Parameters);
Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры); Return SendMessage(Token, "file", UserID, SendingToChannel, Parameters);
КонецФункции EndFunction
// Отправить контакт // Send contact
// Отправляет контакт с номером телефона в чат или канал // Sends a contact with a phone number to a chat or channel
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// ИмяКонтакта - Строка - Имя контакта - name // ContactName - String - Contact name - name
// НомерТелефона - Строка - Номер телефона - phone // PhoneNumber - String - Phone number - phone
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user // UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel // SendingToChannel - Boolean - Sending to channel or bot chat - ischannel
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ОтправитьКонтакт(Знач Токен Function SendContact(Val Token
, Знач ИмяКонтакта , Val ContactName
, Знач НомерТелефона , Val PhoneNumber
, Знач IDПользователя , Val UserID
, Знач ОтправкаВКанал) Экспорт , Val SendingToChannel) Export
Параметры = Новый Структура; Parameters = New Structure;
OPI_Инструменты.ДобавитьПоле("name" , ИмяКонтакта , "Строка", Параметры); OPI_Tools.AddField("name" , ContactName , "String", Parameters);
OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры); OPI_Tools.AddField("phone_number", PhoneNumber, "String", Parameters);
Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры); Return SendMessage(Token, "contact", UserID, SendingToChannel, Parameters);
КонецФункции EndFunction
// Отправить локацию // SendLocation
// Отправляет географические координаты в чат или канал // Sends geographic coordinates to a chat or channel
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// Широта - Строка,Число - Географическая широта - lat // Latitude - String, Number - Geographic latitude - lat
// Долгота - Строка,Число - Географическая долгота - long // Longitude - String, Number - Geographic longitude - long
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user // UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel // SendingToChannel - Boolean - Sending to channel or bot chat - ischannel
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт Function SendLocation(Val Token, Val Latitude, Val Longitude, Val UserID, Val SendingToChannel) Export
Параметры = Новый Структура; Parameters = New Structure;
OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры); OPI_Tools.AddField("lat", Latitude , "String", Parameters);
OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры); OPI_Tools.AddField("lon", Longitude, "String", Parameters);
Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры); Return SendMessage(Token, "location", UserID, SendingToChannel, Parameters);
КонецФункции EndFunction
// Отправить ссылку // SendLink
// Отправляет URL с предпросмотром в чат или канал // Sends a URL with a preview to a chat or channel
// //
// Параметры: // Parameters:
// Токен - Строка - Токен - token // Token - String - Token - token
// URL - Строка - Отправляемая ссылка - url // URL - String - SentLink - url
// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user // UserID - String, Number - User ID. For channel > administrator, for bot > recipient - user
// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel // SendingToChannel - Boolean - Sending to channel or bot chat - ischannel
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber // Key-Value Pair - serialized JSON response from Viber
Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт Function SendLink(Val Token, Val URL, Val UserID, Val SendingToChannel) Export
Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL); Return SendMessage(Token, "url", UserID, SendingToChannel, URL);
КонецФункции EndFunction
// Сформировать клавиатуру из массива кнопок // Create a keyboard from an array of buttons
// Возвращает структура клавиатуры для сообщений // Returns a keyboard structure for messages
// //
// Параметры: // Parameters:
// МассивКнопок - Массив из Строка - Массив кнопок - buttons // ButtonArray - Array of Strings - Array of buttons - buttons
// ЦветКнопок - Строка - HEX цвет кнопок с # в начале - color // ButtonColor - String - HEX color of buttons with # at the beginning - color
// //
// Возвращаемое значение: // Return value:
// Структура - Сформировать клавиатуру из массива кнопок: // Structure - Create a keyboard from an array of buttons:
// * Buttons - Массив из Структура - Массив сформированных кнопок // * Buttons - Array of Structure - Array of formed buttons
// * Type - Строка - Тип клавиатуры // * Type - String - KeyboardType
Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт Function CreateKeyboardFromArrayButton(Val ButtonArray, Val ButtonColor = "#2db9b9") Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок); OPI_TypeConversion.GetLine(ButtonColor);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок); OPI_TypeConversion.GetCollection(ButtonArray);
МассивСтруктурКнопок = Новый Массив; ArrayOfButtonStructures = New Array;
СтруктураКлавиатуры = Новый Структура; KeyboardStructure = New Structure;
Для Каждого ТекстКнопки Из МассивКнопок Цикл For Each ButtonText Of ButtonArray Loop
СтруктураКнопки = Новый Структура; ButtonStructure = New Structure;
СтруктураКнопки.Вставить("ActionType", "reply"); ButtonStructure.Insert("ActionType", "reply");
СтруктураКнопки.Вставить("ActionBody", ТекстКнопки); ButtonStructure.Insert("ActionBody", ButtonText);
СтруктураКнопки.Вставить("Text" , ТекстКнопки); ButtonStructure.Insert("Text" , ButtonText);
СтруктураКнопки.Вставить("BgColor" , ЦветКнопок); ButtonStructure.Insert("BgColor" , ButtonColor);
СтруктураКнопки.Вставить("Coloumns" , 3); ButtonStructure.Insert("Coloumns" , 3);
МассивСтруктурКнопок.Добавить(СтруктураКнопки); ArrayOfButtonStructures.Add(ButtonStructure);
КонецЦикла; EndOfLoop;
СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок); KeyboardStructure.Insert("Buttons", ArrayOfButtonStructures);
СтруктураКлавиатуры.Вставить("Type" , "keyboard"); KeyboardStructure.Insert("Type" , "keyboard");
Возврат СтруктураКлавиатуры; Return KeyboardStructure;
КонецФункции EndFunction
#КонецОбласти #EndRegion
#КонецОбласти #EndRegion
#Область СлужебныеПроцедурыИФункции #Region ServiceProceduresAndFunctions
// Отправить сообщение. // Send message.
// //
// Параметры: // Parameters:
// Токен - Строка - Токен // Token - String - Token
// Тип - Строка - Тип отправляемого сообщения // Type - String - TypeOfSentMessage
// IDПользователя - Строка,Число - ID пользователя Viber // UserID - String, Number - Viber User ID
// ЭтоКанал - Булево - Отправка в канал или чат с ботом // IsChannel - Boolean - Sending to channel or bot chat
// Значение - Строка, Структура - Значение: // Value - String, Structure - Value:
// * URL - Строка - При отправке URL // * 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:
// Произвольный, HTTPОтвет - Отправить сообщение // Arbitrary, HTTP Response - Send message
Функция ОтправитьСообщение(Знач Токен Function SendMessage(Val Token
, Знач Тип , Val Type
, Знач IDПользователя , Val UserID
, Знач ЭтоКанал , Val IsChannel
, Знач Значение = "" , Val Value = ""
, Знач Текст = "" , Val Text = ""
, Знач Клавиатура = "") , Val Keyboard = "")
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_TypeConversion.GetLine(Token);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип); OPI_TypeConversion.GetLine(Type);
OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя); OPI_TypeConversion.GetLine(UserID);
OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст); OPI_TypeConversion.GetLine(Text);
OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал); OPI_TypeConversion.GetBoolean(IsChannel);
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура); OPI_TypeConversion.GetCollection(Keyboard);
СтруктураПараметров = ВернутьСтандартныеПараметры(); ParametersStructure = ReturnStandardParameters();
СтруктураПараметров.Вставить("type", Тип); ParametersStructure.Insert("type", Type);
Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда If (Type = "text" Or Type = "picture") And ValueFilled(Text) Then
СтруктураПараметров.Вставить("text", Текст); ParametersStructure.Insert("text", Text);
КонецЕсли; EndIf;
Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда If TypeValue(Keyboard) = Type("Structure") Then
СтруктураПараметров.Вставить("keyboard", Клавиатура); ParametersStructure.Insert("keyboard", Keyboard);
КонецЕсли; EndIf;
Если ЗначениеЗаполнено(Значение) Тогда If ValueFilled(Value) Then
Если Тип = "file" Тогда If Type = "file" Then
СтруктураПараметров.Вставить("media" , Значение["URL"]); ParametersStructure.Insert("media" , Value["URL"]);
СтруктураПараметров.Вставить("size" , Значение["Размер"]); ParametersStructure.Insert("size" , Value["Size"]);
СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]); ParametersStructure.Insert("file_name", "File." + Value["Extension"]);
ИначеЕсли Тип = "contact" Тогда ElseIf Type = "contact" Then
СтруктураПараметров.Вставить("contact" , Значение); ParametersStructure.Insert("contact" , Value);
ИначеЕсли Тип = "location" Тогда ElseIf Type = "location" Then
СтруктураПараметров.Вставить("location" , Значение); ParametersStructure.Insert("location" , Value);
Иначе Otherwise
СтруктураПараметров.Вставить("media" , Значение); ParametersStructure.Insert("media" , Value);
КонецЕсли; EndIf;
КонецЕсли; EndIf;
Если ЭтоКанал Тогда If IsChannel Then
СтруктураПараметров.Вставить("from", IDПользователя); ParametersStructure.Insert("from", UserID);
URL = "https://chatapi.viber.com/pa/post"; URL = "https://chatapi.viber.com/pa/post";
Иначе Otherwise
СтруктураПараметров.Вставить("receiver", IDПользователя); ParametersStructure.Insert("receiver", UserID);
URL = "https://chatapi.viber.com/pa/send_message"; URL = "https://chatapi.viber.com/pa/send_message";
КонецЕсли; EndIf;
Ответ = OPI_Инструменты.Post(URL, СтруктураПараметров, ТокенВЗаголовки(Токен)); Response = OPI_Tools.Post(URL, ParametersStructure, TokenInHeaders(Token));
Попытка Attempt
Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные()); Return OPI_Tools.JsonToStructure(Response.GetBodyAsBinaryData());
Исключение Exception
Возврат Ответ; Return Response;
КонецПопытки; EndOfAttempt;
КонецФункции EndFunction
Функция ВернутьСтандартныеПараметры() Function ReturnStandardParameters()
СтруктураОтправителя = Новый Структура; SenderStructure = New Structure;
СтруктураОтправителя.Вставить("name" , "Bot"); SenderStructure.Insert("name" , "Bot");
СтруктураОтправителя.Вставить("avatar", ""); SenderStructure.Insert("avatar", "");
СтруктураПараметров = Новый Структура; ParametersStructure = New Structure;
СтруктураПараметров.Вставить("sender", СтруктураОтправителя); ParametersStructure.Insert("sender", SenderStructure);
СтруктураПараметров.Вставить("min_api_version", 1); ParametersStructure.Insert("min_api_version", 1);
Возврат СтруктураПараметров; Return ParametersStructure;
КонецФункции EndFunction
Функция ТокенВЗаголовки(Знач Токен) Function TokenInHeaders(Val Token)
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_TypeConversion.GetLine(Token);
СтруктураЗаголовков = Новый Соответствие; HeadersStructure = New Match;
СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен); HeadersStructure.Insert("X-Viber-Auth-Token", Token);
Возврат СтруктураЗаголовков; Return HeadersStructure;
КонецФункции EndFunction
#КонецОбласти #EndRegion

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os // Location OS: ./OInt/core/Modules/OPI_YandexID.os
// Библиотека: Yandex ID // Library: Yandex ID
// Команда CLI: yandex // CLI Command: yandex
// MIT License // MIT License
@ -29,84 +29,84 @@
// BSLLS:LatinAndCyrillicSymbolInWord-off // BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off // BSLLS:IncorrectLineBreak-off
// Раскомментировать, если выполняется OneScript // Uncomment if OneScript is executed
// #Использовать "../../tools" // #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 - Строка - Client id - id // ClientId - String - Client id - id
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex // Key-Value Pair - serialized JSON response from Yandex
Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт Function GetConfirmationCode(Val ClientId) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); OPI_TypeConversion.GetLine(ClientId);
Параметры = Новый Структура("client_id", ClientId); Parameters = New Structure("client_id", ClientId);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь); 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 - Строка - Client id - id // ClientId - String - Client id - id
// ClientSecret - Строка - Client secret - secret // ClientSecret - String - Client secret - secret
// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device // DeviceCode - String - device_code from GetConfirmationCode() - device
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex // Key-Value Pair - serialized JSON response from Yandex
Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт Function ConvertCodeToToken(Val ClientId, Val ClientSecret, Val DeviceCode) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); OPI_TypeConversion.GetLine(ClientId);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); OPI_TypeConversion.GetLine(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства); OPI_TypeConversion.GetLine(DeviceCode);
Параметры = Новый Структура; Parameters = New Structure;
Параметры.Вставить("grant_type" , "device_code"); Parameters.Insert("grant_type" , "device_code");
Параметры.Вставить("code" , КодУстройства); Parameters.Insert("code" , DeviceCode);
Параметры.Вставить("client_id" , ClientId); Parameters.Insert("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret); Parameters.Insert("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь); Response = OPI_Tools.Post("https://oauth.yandex.ru/token", Parameters, , False);
Возврат Ответ; Return Response;
КонецФункции EndFunction
// Обновить токен // Refresh token
// Обновляет токен по Refresh token // Updates token by Refresh token
// //
// Параметры: // Parameters:
// ClientId - Строка - Client id - id // ClientId - String - Client id - id
// ClientSecret - Строка - Client secret - secret // ClientSecret - String - Client secret - secret
// RefreshToken - Строка - Refresh token - refresh // RefreshToken - String - Refresh token - refresh
// //
// Возвращаемое значение: // Return value:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex // Key-Value Pair - serialized JSON response from Yandex
Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт Function RefreshToken(Val ClientId, Val ClientSecret, Val RefreshToken) Export
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId); OPI_TypeConversion.GetLine(ClientId);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret); OPI_TypeConversion.GetLine(ClientSecret);
OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken); OPI_TypeConversion.GetLine(RefreshToken);
Параметры = Новый Структура; Parameters = New Structure;
Параметры.Вставить("grant_type" , "refresh_token"); Parameters.Insert("grant_type" , "refresh_token");
Параметры.Вставить("refresh_token" , RefreshToken); Parameters.Insert("refresh_token" , RefreshToken);
Параметры.Вставить("client_id" , ClientId); Parameters.Insert("client_id" , ClientId);
Параметры.Вставить("client_secret" , ClientSecret); Parameters.Insert("client_secret" , ClientSecret);
Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь); Response = OPI_Tools.Post("https://oauth.yandex.ru/token", Parameters, , False);
Возврат Ответ; Return Response;
КонецФункции EndFunction
#КонецОбласти #EndRegion

File diff suppressed because it is too large Load Diff

View File

@ -1,110 +0,0 @@
// Расположение 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 По Количество Цикл
Части.Добавить(Строка);
КонецЦикла;
Возврат СтрСоединить(Части, "");
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -1,470 +0,0 @@
// Расположение 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";
ФайлЛога = Новый Файл(ПутьКФайлу);
Если Не ФайлЛога.Существует() Тогда
ДокументЛога = Новый ТекстовыйДокумент;
ДокументЛога.УстановитьТекст(Данные);
ДокументЛога.Записать(ПутьКФайлу);
КонецЕсли;
Исключение
Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
#КонецОбласти

View File

@ -1,320 +0,0 @@
// Расположение 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Значение(Тип(Дата), Значение);
КонецЕсли;
Исключение
ООД = Новый ОписаниеТипов(Дата);
Значение = ООД.ПривестиЗначение(Значение);
КонецПопытки;
КонецПроцедуры
Процедура ПолучитьЧисло(Значение) Экспорт
ОписаниеТипа = Новый ОписаниеТипов("Число");
Значение = ОписаниеТипа.ПривестиЗначение(Значение);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЭтоКоллекция(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Массив")
Или ТипЗнч(Значение) = Тип("Структура")
Или ТипЗнч(Значение) = Тип("Соответствие");
КонецФункции
Функция ЭтоСимвольное(Знач Значение)
Возврат ТипЗнч(Значение) = Тип("Строка")
Или ТипЗнч(Значение) = Тип("Число")
Или ТипЗнч(Значение) = Тип("Дата");
КонецФункции
#КонецОбласти

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff