mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-03-17 21:08:03 +02:00
Преобразование OPI -> OInt (workflow)
This commit is contained in:
parent
122676010e
commit
e3e28253e2
@ -540,7 +540,8 @@
|
||||
СоответствиеФайла.Вставить(Файл, MIME);
|
||||
|
||||
Размер = Файл.Размер();
|
||||
РазмерЧасти = 268435456 + 1;
|
||||
РазмерЧасти = 268435456;
|
||||
РазмерЧасти = РазмерЧасти + 1;
|
||||
|
||||
Если Размер < РазмерЧасти Тогда
|
||||
Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
|
||||
@ -578,10 +579,8 @@
|
||||
Прервать;
|
||||
КонецЦикла;
|
||||
|
||||
РазмерЧасти = 268435456;
|
||||
URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
|
||||
Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина);
|
||||
|
||||
URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
|
||||
Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина);
|
||||
АдресЗагрузки = Ответ.Заголовки["Location"];
|
||||
|
||||
Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда
|
||||
@ -589,15 +588,27 @@
|
||||
Возврат Ответ;
|
||||
КонецЕсли;
|
||||
|
||||
ПрочитанноБайт = 0;
|
||||
ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки);
|
||||
Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ);
|
||||
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки)
|
||||
|
||||
Ответ = "";
|
||||
РазмерЧасти = 268435456;
|
||||
ПрочитаноБайт = 0;
|
||||
ТекущаяПозиция = 0;
|
||||
ОбщийРазмер = Двоичные.Размер();
|
||||
СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер);
|
||||
|
||||
Пока ПрочитанноБайт < ОбщийРазмер Цикл
|
||||
Пока ПрочитаноБайт < ОбщийРазмер Цикл
|
||||
|
||||
ЧтениеДанных = Новый ЧтениеДанных(Двоичные);
|
||||
ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
|
||||
ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
|
||||
Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
|
||||
ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
|
||||
РазмерТекущих = ТекущиеДанные.Размер();
|
||||
@ -621,41 +632,11 @@
|
||||
|
||||
Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
|
||||
|
||||
Если Ответ.КодСостояния >= 400 И Ответ.КодСостояния < 600 Тогда
|
||||
|
||||
ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
|
||||
ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
|
||||
|
||||
ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
|
||||
|
||||
Если ОтветПроверки.КодСостояния >= 200 И ОтветПроверки.КодСостояния < 300 Тогда
|
||||
OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
|
||||
Возврат ОтветПроверки;
|
||||
ИначеЕсли ОтветПроверки.КодСостояния = 308 Тогда
|
||||
ЗагруженныеДанные = Ответ.Заголовки["Range"];
|
||||
Иначе
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
КонецЕсли;
|
||||
|
||||
Иначе
|
||||
ЗагруженныеДанные = Ответ.Заголовки["Range"];
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
КонецЕсли;
|
||||
|
||||
ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
|
||||
МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
|
||||
|
||||
Если Не МассивИнформации.Количество() = 2 Тогда
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
КонецЕсли;
|
||||
|
||||
ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
|
||||
РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
|
||||
|
||||
Если ЗначениеЗаполнено(РезультатПроверки) Тогда
|
||||
Возврат РезультатПроверки;
|
||||
КонецЕсли;
|
||||
|
||||
СтрТекущаяПозицияМБ = OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция / 1024 / 1024);
|
||||
СтрОбщийРазмерМБ = OPI_Инструменты.ЧислоВСтроку(Окр(ОбщийРазмер / 1024 / 1024, 2));
|
||||
@ -668,9 +649,63 @@
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
|
||||
|
||||
НачалоКодовОшибок = 400;
|
||||
КонецКодовПадений = 600;
|
||||
НачалоКодовУспеха = 200;
|
||||
КонецКодовУспеха = 300;
|
||||
Перенаправление = 308;
|
||||
|
||||
Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
|
||||
|
||||
ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
|
||||
ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
|
||||
|
||||
ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
|
||||
|
||||
Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
|
||||
|
||||
OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
|
||||
Возврат ОтветПроверки;
|
||||
|
||||
ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
|
||||
|
||||
ЗагруженныеДанные = Ответ.Заголовки["Range"];
|
||||
|
||||
Иначе
|
||||
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Иначе
|
||||
ЗагруженныеДанные = Ответ.Заголовки["Range"];
|
||||
КонецЕсли;
|
||||
|
||||
Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
КонецЕсли;
|
||||
|
||||
ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
|
||||
МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
|
||||
НеобходимоЧастей = 2;
|
||||
|
||||
Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
|
||||
OPI_Инструменты.ОбработатьОтвет(Ответ);
|
||||
Возврат Ответ;
|
||||
КонецЕсли;
|
||||
|
||||
ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
|
||||
|
||||
Возврат "";
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -30,14 +30,47 @@
|
||||
|
||||
#Область ПрограммныйИнтерфейс
|
||||
|
||||
#Область УправлениеИНастройки
|
||||
|
||||
Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
|
||||
|
||||
URL = "https://slack.com/api/auth.test";
|
||||
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
|
||||
|
||||
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция ПолучитьСписокРабочихОбластей(Знач Токен) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
|
||||
|
||||
URL = "https://slack.com/api/auth.teams.list";
|
||||
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
|
||||
|
||||
Ответ = OPI_Инструменты.Get(URL, , Заголовки);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область РаботаСЧатами
|
||||
|
||||
Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст) Экспорт
|
||||
Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст, Знач МассивБлоков = "") Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Канал);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
|
||||
|
||||
ЕстьБлоки = ЗначениеЗаполнено(МассивБлоков);
|
||||
|
||||
URL = "https://slack.com/api/chat.postMessage";
|
||||
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
|
||||
|
||||
@ -45,12 +78,55 @@
|
||||
Параметры.Вставить("channel", Канал);
|
||||
Параметры.Вставить("text" , Текст);
|
||||
|
||||
Если ЕстьБлоки Тогда
|
||||
OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивБлоков);
|
||||
Параметры.Вставить("blocks" , МассивБлоков);
|
||||
КонецЕсли;
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Канал);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(Отметка);
|
||||
|
||||
URL = "https://slack.com/api/chat.delete";
|
||||
Заголовки = ПолучитьЗаголовокАвторизации(Токен);
|
||||
|
||||
Параметры = Новый Структура;
|
||||
Параметры.Вставить("channel", Канал);
|
||||
Параметры.Вставить("ts" , Отметка);
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
|
||||
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#Область ФормированиеБлоков
|
||||
|
||||
Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт
|
||||
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
|
||||
OPI_ПреобразованиеТипов.ПолучитьСтроку(АльтернативныйТекст);
|
||||
|
||||
Блок = Новый Соответствие;
|
||||
|
||||
Блок.Вставить("type" , "image");
|
||||
Блок.Вставить("image_url", URL);
|
||||
Блок.Вставить("alt_text" , АльтернативныйТекст);
|
||||
|
||||
Возврат Блок;
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -26,6 +26,7 @@
|
||||
// BSLLS:LatinAndCyrillicSymbolInWord-off
|
||||
// BSLLS:IncorrectLineBreak-off
|
||||
// BSLLS:UnreachableCode-off
|
||||
// BSLLS:CommentedCode-off
|
||||
|
||||
// Раскомментировать, если выполняется OneScript
|
||||
#Использовать "../../tools"
|
||||
@ -69,7 +70,7 @@
|
||||
Ответ = OPI_Инструменты.Get(URL);
|
||||
Возврат Ответ;
|
||||
|
||||
КонецФункции
|
||||
КонецФункции
|
||||
|
||||
// Установить Webhook
|
||||
// Устанавливает URL обработчика событий бота для работы в режиме Webhook
|
||||
@ -961,7 +962,7 @@
|
||||
Если ОднаПодОдной Тогда
|
||||
Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
|
||||
Иначе
|
||||
Строки = СоздатьДлиннуюКлваиатуру(МассивКнопок);
|
||||
Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок);
|
||||
КонецЕсли;
|
||||
|
||||
Если ПодСообщением Тогда
|
||||
@ -1136,7 +1137,7 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция СоздатьДлиннуюКлваиатуру(Знач МассивКнопок)
|
||||
Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок)
|
||||
|
||||
Строки = Новый Массив;
|
||||
Кнопки = Новый Массив;
|
||||
|
@ -641,9 +641,7 @@
|
||||
ProcessingInfo = "processing_info";
|
||||
Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL);
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
|
||||
|
||||
Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
|
||||
Информация = Ответ[ProcessingInfo];
|
||||
|
||||
Если Не ЗначениеЗаполнено(Информация) Тогда
|
||||
|
@ -29,6 +29,7 @@
|
||||
// BSLLS:IncorrectLineBreak-off
|
||||
// BSLLS:NumberOfOptionalParams-off
|
||||
// BSLLS:UsingServiceTag-off
|
||||
// BSLLS:UnusedLocalVariable-off
|
||||
|
||||
//@skip-check method-too-many-params
|
||||
|
||||
|
@ -2830,14 +2830,77 @@
|
||||
|
||||
#Область Slack
|
||||
|
||||
Процедура Слак_ОтправитьСообщение() Экспорт
|
||||
Процедура Слак_ПолучитьИнформациюОБоте() Экспорт
|
||||
|
||||
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
|
||||
Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен);
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте");
|
||||
|
||||
Проверка_СлакОк(Результат);
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено();
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено();
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
|
||||
Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
|
||||
Текст = "Тестовое сообщение";
|
||||
Процедура Слак_ПолучитьСписокОбластей() Экспорт
|
||||
|
||||
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
|
||||
Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен);
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей");
|
||||
|
||||
Проверка_СлакОк(Результат);
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
|
||||
Процедура Слак_ОтправитьУдалитьСообщение() Экспорт
|
||||
|
||||
Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
|
||||
Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
|
||||
Текст = "Тестовое сообщение 1";
|
||||
Отметки = Новый Массив;
|
||||
Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
|
||||
|
||||
Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст);
|
||||
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
|
||||
|
||||
Проверка_СлакОк(Результат);
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
|
||||
|
||||
Отметки.Добавить(Результат["ts"]);
|
||||
|
||||
МассивБлоков = Новый Массив;
|
||||
Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
|
||||
МассивБлоков.Добавить(Блок);
|
||||
|
||||
Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, МассивБлоков);
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
|
||||
|
||||
Проверка_СлакОк(Результат);
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
|
||||
|
||||
Отметки.Добавить(Результат["ts"]);
|
||||
|
||||
|
||||
Для Каждого Отметка Из Отметки Цикл
|
||||
|
||||
Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка);
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
|
||||
|
||||
Проверка_СлакОк(Результат);
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
@ -2971,6 +3034,13 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура Проверка_СлакОк(Знач Результат)
|
||||
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
|
||||
OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
#КонецОбласти
|
||||
|
@ -332,7 +332,9 @@
|
||||
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн);
|
||||
НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн);
|
||||
|
||||
НовыйТест(ТаблицаТестов, "Слак_ОтправитьСообщение" , "Отправить сообщение" , Слак);
|
||||
НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак);
|
||||
НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак);
|
||||
НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак);
|
||||
|
||||
Возврат ТаблицаТестов;
|
||||
|
||||
|
@ -134,7 +134,11 @@
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура ПолучитьМассив(Значение) Экспорт
|
||||
|
||||
|
||||
Если ТипЗнч(Значение) = Тип("Массив") Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
Если ТипЗнч(Значение) = Тип("Строка")
|
||||
И СтрНачинаетсяС(Значение, "[")
|
||||
И СтрЗаканчиваетсяНа(Значение, "]") Тогда
|
||||
|
@ -27,6 +27,7 @@
|
||||
// BSLLS:IncorrectLineBreak-off
|
||||
// BSLLS:UnusedLocalVariable-off
|
||||
// BSLLS:UsingServiceTag-off
|
||||
// BSLLS:NumberOfOptionalParams-off
|
||||
|
||||
//@skip-check module-unused-local-variable
|
||||
//@skip-check method-too-many-params
|
||||
@ -388,7 +389,7 @@
|
||||
Параметры = Новый Структура;
|
||||
КонецЕсли;
|
||||
|
||||
ТипДанных = ?(JSON, "application/json", "application/x-www-form-urlencoded");
|
||||
ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");
|
||||
СтруктураURL = РазбитьURL(URL);
|
||||
Сервер = СтруктураURL["Сервер"];
|
||||
Адрес = СтруктураURL["Адрес"];
|
||||
@ -782,7 +783,6 @@
|
||||
Прервать;
|
||||
КонецЕсли;
|
||||
|
||||
|
||||
ЗаписьДанных.Записать(ТекущиеДанные);
|
||||
|
||||
ОсвободитьОбъект(ТекущиеДанные);
|
||||
|
Loading…
x
Reference in New Issue
Block a user