From 75960690bdf848b23a75cf68b4299a17362d879a Mon Sep 17 00:00:00 2001 From: Permichev Vladislav Date: Thu, 17 Oct 2024 17:37:33 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BF=D0=BE=D0=B4=D1=81=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D0=BC=D1=8B=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B9=20=D0=B8=20=D0=B4=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=B8=D1=81=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20(#120)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Разработан метод получения содержимого каталога SFTP #117; Добавлены реквизиты для хранения файла в НЕ текстовом формате в историю интеграции #112. Рефакторинг общего модуля пбп_ИнтеграцииСервер * Исправление ошибок по Sonarqube. #121 Добавление метода удаления файлов на SFTP. Содержит исправления для #124 и #125 --- .bsl-language-server.json | 2 +- ...1\200\320\260\321\206\320\270\320\270.xml" | 84 + .../Ext/ObjectModule.bsl" | 10 + .../Ext/Form.xml" | 95 +- .../Ext/Form/Module.bsl" | 264 ++- ...20\260\321\206\320\270\320\270FTPSFTP.xml" | 23 + .../Ext/Module.bsl" | 1456 +++++++++++++++++ .../Ext/Module.bsl" | 1268 +------------- ...0\265\320\261\320\275\321\213\320\271.xml" | 23 + .../Ext/Module.bsl" | 289 ++++ .../Ext/Module.bsl" | 2 +- .../Ext/Module.bsl" | 11 +- ...0\273\320\270\320\265\320\275\321\202.xml" | 23 + .../Ext/Module.bsl" | 100 ++ ...1\201\320\260\321\206\320\270\321\217.xml" | 23 + .../Ext/Module.bsl" | 51 + .../Ext/Module.bsl" | 12 +- ...0\273\320\270\320\265\320\275\321\202.xml" | 23 + .../Ext/Module.bsl" | 120 ++ src/cf/Configuration.xml | 8 +- ...1\200\320\260\321\206\320\270\320\270.xml" | 15 + .../Ext/Rights.xml" | 44 + ...1\206\320\270\321\217\320\274\320\270.xml" | 3 + 23 files changed, 2677 insertions(+), 1272 deletions(-) create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP.xml" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP/Ext/Module.bsl" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.xml" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202.xml" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217.xml" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.xml" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" create mode 100644 "src/cf/Roles/\320\277\320\261\320\277_\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\230\321\201\321\202\320\276\321\200\320\270\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.xml" create mode 100644 "src/cf/Roles/\320\277\320\261\320\277_\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\230\321\201\321\202\320\276\321\200\320\270\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Ext/Rights.xml" diff --git a/.bsl-language-server.json b/.bsl-language-server.json index ec9744e0..43d8e810 100644 --- a/.bsl-language-server.json +++ b/.bsl-language-server.json @@ -10,7 +10,7 @@ "userWordsToIgnore": "пбп" }, "LatinAndCyrillicSymbolInWord": { - "excludeWords": "ЧтениеXML, ЧтениеJSON, ЗаписьXML, ЗаписьJSON, ComОбъект, ФабрикаXDTO, ОбъектXDTO, СоединениеFTP, HTTPСоединение, HTTPЗапрос, HTTPСервисОтвет, SMSСообщение, WSПрокси, ИмяCOMОбъекта, ЭтоWindowsКлиент", + "excludeWords": "ЧтениеXML, ЧтениеJSON, ЗаписьXML, ЗаписьJSON, ComОбъект, ФабрикаXDTO, ОбъектXDTO, СоединениеFTP, HTTPСоединение, HTTPЗапрос, HTTPСервисОтвет, SMSСообщение, WSПрокси, ИмяCOMОбъекта, ЭтоWindowsКлиент, ЭтоLinuxСервер, ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока, ЗаполнитьПараметрыПодключенияКSFTPСерверу, ПолучитьТаблицуФайловСодержимогоSFTPСервера", "allowTrailingPartsInAnotherLanguage": true } } diff --git "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.xml" "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.xml" index 346971cf..adf69872 100644 --- "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.xml" +++ "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.xml" @@ -1001,6 +1001,90 @@ Use + + + ИмяФайлаСообщения + + + ru + Имя файла сообщения + + + + + xs:string + + 150 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + + + + ФайлСообщения + + + ru + Файл сообщения + + + + + v8:ValueStorage + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + diff --git "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Ext/ObjectModule.bsl" "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Ext/ObjectModule.bsl" index 0b072f1c..ab4851a8 100644 --- "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Ext/ObjectModule.bsl" +++ "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Ext/ObjectModule.bsl" @@ -20,6 +20,16 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +#Область СлужебныйПрограммныйИнтерфейс + +Функция ПолучитьДанныеФайлаСообщения() Экспорт + + Возврат ФайлСообщения.Получить(); + +КонецФункции + +#КонецОбласти // СлужебныйПрограммныйИнтерфейс + #Область ОбработчикиСобытий Процедура ПередУдалением(Отказ) diff --git "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form.xml" "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form.xml" index a3658f28..c5f00b6e 100644 --- "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form.xml" +++ "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form.xml" @@ -284,13 +284,47 @@ - + ЗапросИсходящийОтформатированный None EnterOnInput - - + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа данные сообщения исходящего</v8:content> + </v8:item> + + + + ru + Группа данные сообщения исходящего + + + None + false + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Прикрепленный файл обмена:</v8:content> + </v8:item> + + + + + + + @@ -313,13 +347,47 @@ - + ЗапросВходящийОтформатированный None EnterOnInput - - + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа данные сообщения входящего</v8:content> + </v8:item> + + + + ru + Группа данные сообщения исходящего + + + None + false + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Прикрепленный файл обмена:</v8:content> + </v8:item> + + + + + + + @@ -586,5 +654,20 @@ КопироватьВБуферОбмена TextPicture + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сохранить файл сообщения обмена</v8:content> + </v8:item> + + + + ru + Сохранить файл сообщения обмена + + + СохранитьФайлСообщенияОбмена + \ No newline at end of file diff --git "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" index 529171f8..e90ccbf9 100644 --- "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" +++ "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\321\201\321\202\320\276\321\200\320\270\321\217\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" @@ -33,21 +33,24 @@ УстановитьСвойстваЭлементов(); ЭтоЗагрузка = Объект.Статус = Перечисления.пбп_СтатусыИнтеграции.Загружено - ИЛИ Объект.Статус = Перечисления.пбп_СтатусыИнтеграции.ОшибкаЗагрузки; + Или Объект.Статус = Перечисления.пбп_СтатусыИнтеграции.ОшибкаЗагрузки; Элементы.ГруппаОбъектыОбмена.Заголовок = ?(ЭтоЗагрузка, "Загруженные объекты", "Выгруженные объекты"); - Если НЕ Объект.Ошибка Тогда + Если Не Объект.Ошибка Тогда Элементы.ГруппаТекстОшибки.Видимость = Ложь; Элементы.Ошибка.Видимость = Ложь; КонецЕсли; - Если Объект.ФорматИнтеграции <> Перечисления.пбп_ФорматыИнтеграций.ПроизвольныйФормат Тогда + Если Объект.ФорматИнтеграции = Перечисления.пбп_ФорматыИнтеграций.XML + Или Объект.ФорматИнтеграции = Перечисления.пбп_ФорматыИнтеграций.JSON Тогда Элементы.ГруппаФорматированиеТекстаЗапроса.Видимость = Истина; Элементы.ВидОтображенияЗапроса.Видимость = Объект.ФорматИнтеграции = Перечисления.пбп_ФорматыИнтеграций.JSON; - Элементы.ЗапросИсходящий.Вид = ВидПоляФормы.ПолеHTMLДокумента; - Элементы.ЗапросВходящий.Вид = ВидПоляФормы.ПолеHTMLДокумента; - Элементы.ЗапросИсходящий.УстановитьДействие("ДокументСформирован", "ЗапросИсходящийДокументСформирован_Подключаемый"); - Элементы.ЗапросВходящий.УстановитьДействие("ДокументСформирован", "ЗапросВходящийДокументСформирован_Подключаемый"); + Элементы.ИсходящееСообщение.Вид = ВидПоляФормы.ПолеHTMLДокумента; + Элементы.ВходящееСообщение.Вид = ВидПоляФормы.ПолеHTMLДокумента; + Элементы.ИсходящееСообщение.УстановитьДействие("ДокументСформирован", + "ЗапросИсходящийДокументСформирован_Подключаемый"); + Элементы.ВходящееСообщение.УстановитьДействие("ДокументСформирован", + "ЗапросВходящийДокументСформирован_Подключаемый"); Иначе Элементы.ГруппаФорматированиеТекстаЗапроса.Видимость = Ложь; Если ЗначениеЗаполнено(Объект.ВходящееСообщение) Тогда @@ -119,8 +122,8 @@ Предопределенный = "Перечисление.пбп_ФорматыИнтеграций.XML"; Если Объект.ФорматИнтеграции = пбп_ОбщегоНазначенияСлужебныйКлиент.ПредопределенныйЭлемент(Предопределенный) Тогда - Элементы.ЗапросИсходящий.Документ.defaultView.Xonomy.plusminus("xonomy1", true); - Элементы.ЗапросВходящий.Документ.defaultView.Xonomy.plusminus("xonomy1", true); + Элементы.ИсходящееСообщение.Документ.defaultView.Xonomy.plusminus("xonomy1", True); + Элементы.ВходящееСообщение.Документ.defaultView.Xonomy.plusminus("xonomy1", True); Иначе Если ВидОтображенияЗапроса Тогда ДокументВнешнийОбъектИсходящий.expandAll(); @@ -138,8 +141,8 @@ Предопределенный = "Перечисление.пбп_ФорматыИнтеграций.XML"; Если Объект.ФорматИнтеграции = пбп_ОбщегоНазначенияСлужебныйКлиент.ПредопределенныйЭлемент(Предопределенный) Тогда - Элементы.ЗапросИсходящий.Документ.defaultView.Xonomy.plusminus("xonomy1", false); - Элементы.ЗапросВходящий.Документ.defaultView.Xonomy.plusminus("xonomy1", false); + Элементы.ИсходящееСообщение.Документ.defaultView.Xonomy.plusminus("xonomy1", False); + Элементы.ВходящееСообщение.Документ.defaultView.Xonomy.plusminus("xonomy1", False); Иначе Если ВидОтображенияЗапроса Тогда ДокументВнешнийОбъектИсходящий.collapseAll(); @@ -172,6 +175,37 @@ КонецПроцедуры +&НаКлиенте +Процедура СохранитьФайлСообщенияОбмена(Команда) + + Если ПустаяСтрока(Объект.ИмяФайлаСообщения) Тогда + Возврат; + КонецЕсли; + + ЗаголовокДиалога = НСтр("ru = 'Укажите файл внешней компоненты'"); + + МассивРазделителей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + Объект.ИмяФайлаСообщения, ".", Истина, Истина); + ИмяКомпоненты = МассивРазделителей[0]; + КоличествоРазделимых = 2; + Если МассивРазделителей.Количество() = КоличествоРазделимых Тогда + Расширение = МассивРазделителей[1]; + КонецЕсли; + + РежимОткрытияДиалога = РежимДиалогаВыбораФайла.Сохранение; + ДиалогСохранения = Новый ДиалогВыбораФайла(РежимОткрытияДиалога); + ДиалогСохранения.ПолноеИмяФайла = ИмяКомпоненты; + ДиалогСохранения.Расширение = Расширение; + ДиалогСохранения.Заголовок = ЗаголовокДиалога; + ДиалогСохранения.ПредварительныйПросмотр = Ложь; + ДиалогСохранения.Каталог = ""; + + Оповещение = Новый ОписаниеОповещения("ОбработчикВыбораКаталогаСохранениеЗавершениеПослеВыбораВДиалоге", ЭтотОбъект); + + ДиалогСохранения.Показать(Оповещение); + +КонецПроцедуры + #КонецОбласти // ОбработчикиКомандФормы #Область СлужебныеПроцедурыИФункции @@ -179,38 +213,64 @@ &НаСервере Процедура УстановитьСвойстваЭлементов() + Элементы.СохранитьФайлСообщенияОбменаИсх.Заголовок = Объект.ИмяФайлаСообщения; + Элементы.СохранитьФайлСообщенияОбменаВх.Заголовок = Объект.ИмяФайлаСообщения; + Если ЗначениеЗаполнено(Объект.ИнтеграционныйПоток) Тогда ТипИнтеграции = пбп_ОбщегоНазначенияСервер.ЗначениеРеквизитаОбъекта( Объект.ИнтеграционныйПоток, "НастройкаИнтеграции.ТипИнтеграции"); ЭлементНаследования = Справочники.пбп_ТипыИнтеграций .ПолучитьПредопределенныйЭлементНаследованияНастроекТипаИнтеграции(ТипИнтеграции); + + ЭтоВыгрузка = НаправлениеИнтеграцииВыгружено(Объект.Статус); + Если ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.Каталог Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.FTPРесурсы Тогда - Элементы.ИсходящееСообщение.Заголовок = НСтр("ru = 'Содержимое записываемого файла'"); - Элементы.ВходящееСообщение.Заголовок = НСтр("ru = 'Содержимое читаемого файла'"); - - ЭтоВыгрузка = НаправлениеИнтеграцииВыгружено(Объект.Статус); - Элементы.ИсходящееСообщение.Видимость = ЭтоВыгрузка; - Элементы.ВходящееСообщение.Видимость = Не ЭтоВыгрузка; + УстановитьСвойстваЭлементовФайловогоОбмена(ТипИнтеграции, ЭтоВыгрузка); ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.ПочтовыйКлиент Тогда - Элементы.ИсходящееСообщение.Заголовок = НСтр("ru = 'Содержимое тела письма'"); - Элементы.ИсходящееСообщение.Видимость = Истина; - Элементы.ВходящееСообщение.Видимость = Ложь; + Элементы.ГруппаЗапросИсходящий.Заголовок = НСтр("ru = 'Содержимое тела письма';"); + Элементы.ГруппаЗапросИсходящий.Видимость = Истина; + Элементы.ГруппаЗапросВходящий.Видимость = Ложь; ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.COM Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.ВнешняяКомпонента Тогда - Элементы.ИсходящееСообщение.Видимость = Ложь; - Элементы.ВходящееСообщение.Видимость = Ложь; + Элементы.ГруппаЗапросИсходящий.Видимость = Ложь; + Элементы.ГруппаЗапросВходящий.Видимость = Ложь; ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.КоманднаяСтрока Тогда - Элементы.ИсходящееСообщение.Заголовок = НСтр("ru = 'Выполняемая команда'"); - Элементы.ВходящееСообщение.Заголовок = НСтр("ru = 'Результат выполнения команды'"); - Элементы.ИсходящееСообщение.Видимость = Истина; - Элементы.ВходящееСообщение.Видимость = Истина; + Элементы.ГруппаЗапросИсходящий.Заголовок = НСтр("ru = 'Выполняемая команда';"); + Элементы.ГруппаЗапросВходящий.Заголовок = НСтр("ru = 'Результат выполнения команды';"); + Элементы.ГруппаЗапросИсходящий.Видимость = Истина; + Элементы.ГруппаЗапросВходящий.Видимость = Истина; Иначе - Элементы.ИсходящееСообщение.Заголовок = НСтр("ru = 'Запрос исходящий'"); - Элементы.ВходящееСообщение.Заголовок = НСтр("ru = 'Запрос входящий'"); - Элементы.ИсходящееСообщение.Видимость = Истина; - Элементы.ВходящееСообщение.Видимость = Истина; + Элементы.ГруппаЗапросИсходящий.Заголовок = НСтр("ru = 'Запрос исходящий';"); + Элементы.ГруппаЗапросВходящий.Заголовок = НСтр("ru = 'Запрос входящий';"); + Элементы.ГруппаЗапросИсходящий.Видимость = Истина; + Элементы.ГруппаЗапросВходящий.Видимость = Истина; КонецЕсли; + + ВывестиСсылкуНаФайлПриНеобходимости(ЭтоВыгрузка, ЭлементНаследования, ТипИнтеграции); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьСвойстваЭлементовФайловогоОбмена(ТипИнтеграции, ЭтоВыгрузка) + + ЗаголовокЗаписываемыйФайл = НСтр("ru = 'Содержимое записываемого файла';"); + ЗаголовокЧитаемыйФайл = НСтр("ru = 'Содержимое читаемого файла';"); + + Если ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.SFTP Тогда + Элементы.ГруппаЗапросИсходящий.Заголовок = НСтр("ru = 'Исполняемая команда';"); + Если ЭтоВыгрузка Тогда + Элементы.ГруппаЗапросВходящий.Заголовок = ЗаголовокЗаписываемыйФайл; + Иначе + Элементы.ГруппаЗапросВходящий.Заголовок = ЗаголовокЧитаемыйФайл; + КонецЕсли; + Иначе + Элементы.ГруппаЗапросИсходящий.Заголовок = ЗаголовокЗаписываемыйФайл; + Элементы.ГруппаЗапросВходящий.Заголовок = ЗаголовокЧитаемыйФайл; + + Элементы.ГруппаЗапросИсходящий.Видимость = ЭтоВыгрузка; + Элементы.ГруппаЗапросВходящий.Видимость = Не ЭтоВыгрузка; КонецЕсли; КонецПроцедуры @@ -223,6 +283,45 @@ КонецФункции +&НаСервере +Процедура ВывестиСсылкуНаФайлПриНеобходимости(ЭтоВыгрузка, ЭлементНаследования, ТипИнтеграции) + + ПоказатьСсылкуНаФайлВместоЗапроса = Не ПустаяСтрока(Объект.ИмяФайлаСообщения) + И Не (ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.COM + Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.ВнешняяКомпонента); + + Если ПоказатьСсылкуНаФайлВместоЗапроса Тогда + Если ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.Каталог + Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.FTPРесурсы + Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.ПочтовыйКлиент Тогда + Если ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.SFTP Тогда + Элементы.ГруппаДанныеСообщенияИсходящего.Видимость = Ложь; + Элементы.ИсходящееСообщение.Видимость = Истина; + Элементы.ГруппаДанныеСообщенияВходящего.Видимость = Истина; + Элементы.ВходящееСообщение.Видимость = Ложь; + Иначе + Элементы.ГруппаДанныеСообщенияИсходящего.Видимость = ЭтоВыгрузка; + Элементы.ИсходящееСообщение.Видимость = Не ЭтоВыгрузка; + Элементы.ГруппаДанныеСообщенияВходящего.Видимость = Не ЭтоВыгрузка; + Элементы.ВходящееСообщение.Видимость = ЭтоВыгрузка; + КонецЕсли; + ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.RESTAPI + Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.SOAP Тогда + Элементы.ГруппаДанныеСообщенияИсходящего.Видимость = ЭтоВыгрузка; + Элементы.ГруппаДанныеСообщенияВходящего.Видимость = Не ЭтоВыгрузка; + Иначе + Элементы.ГруппаДанныеСообщенияИсходящего.Видимость = ЭтоВыгрузка; + Элементы.ГруппаДанныеСообщенияВходящего.Видимость = Не ЭтоВыгрузка; + Элементы.ИсходящееСообщение.Видимость = Ложь; + Элементы.ВходящееСообщение.Видимость = Ложь; + КонецЕсли; + Иначе + Элементы.ГруппаДанныеСообщенияИсходящего.Видимость = Ложь; + Элементы.ГруппаДанныеСообщенияВходящего.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + &НаСервере Функция ОтформатироватьСообщениеИнтеграции(Знач ТекстСообщенияИнтеграции) @@ -238,40 +337,61 @@ КонецФункции &НаКлиенте -Процедура ИнициализироватьБазовыйФайлРедактора(ФорматИнтеграции) +Процедура ИнициализироватьБазовыйФайлРедактора(ФорматИнтеграцииСтрокой) #Если ВебКлиент Тогда - ВызватьИсключение НСтр("ru = 'Редактор " + ФорматИнтеграции + " не предназначен для веб-клиента'"); + ВызватьИсключение НСтр("ru = 'Редактор " + ФорматИнтеграцииСтрокой + " не предназначен для веб-клиента'"); #Иначе - Если ФорматИнтеграции = "JSON" Тогда - ЗапросИсходящийОтформатированный = ПолучитьБазовыйФайлРедактора(ФорматИнтеграции); - ЗапросВходящийОтформатированный = ЗапросИсходящийОтформатированный; - Иначе - ЗапросИсходящийОтформатированный = ПолучитьБазовыйФайлРедактора(ФорматИнтеграции, "Out"); - ЗапросВходящийОтформатированный = ПолучитьБазовыйФайлРедактора(ФорматИнтеграции, "In"); + Если ФорматИнтеграцииСтрокой = "JSON" Тогда + СохранитьБазовыйФайлРедактора(ФорматИнтеграцииСтрокой); + ИначеЕсли ФорматИнтеграцииСтрокой = "XML" Тогда + СохранитьБазовыйФайлРедактора(ФорматИнтеграцииСтрокой, "Out"); + СохранитьБазовыйФайлРедактора(ФорматИнтеграцииСтрокой, "In"); КонецЕсли; #КонецЕсли КонецПроцедуры &НаКлиенте -Функция ПолучитьБазовыйФайлРедактора(ФорматИнтеграции, Дополнение = "") +Процедура СохранитьБазовыйФайлРедактора(ФорматИнтеграции, Дополнение = "") + + Расширение = ФорматИнтеграции + "Editor" + Дополнение; + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ФорматИнтеграции" , ФорматИнтеграции); + ДополнительныеПараметры.Вставить("Дополнение" , Дополнение); + + Оповещение = Новый ОписаниеОповещения( + "ПослеСозданияВременногоКаталогаДляБазовогоРедактора", + ЭтотОбъект, ДополнительныеПараметры); + пбп_ФайловаяСистемаКлиентПереадресация.СоздатьВременныйКаталог(Оповещение, Расширение); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеСозданияВременногоКаталогаДляБазовогоРедактора( + Результат, Знач ДополнительныеПараметры = Неопределено) Экспорт #Если НЕ ВебКлиент Тогда - КаталогКомпоненты = КаталогВременныхФайлов() + ФорматИнтеграции + "Editor" + Дополнение; - КаталогНаДиске = Новый Файл(КаталогКомпоненты); - ДвоичныеДанные = ДвоичныеДанныеМакета(ФорматИнтеграции); + ДвоичныеДанные = ДвоичныеДанныеМакета(ДополнительныеПараметры.ФорматИнтеграции); Чтение = Новый ЧтениеДанных(ДвоичныеДанные); Файл = Новый ЧтениеZipФайла(Чтение.ИсходныйПоток()); - Файл.ИзвлечьВсе(КаталогКомпоненты); + Файл.ИзвлечьВсе(Результат); + + БазовыйФайлРедактора = Результат + ПолучитьРазделительПути() + "index.html"; - БазовыйФайлРедактора = КаталогКомпоненты + ПолучитьРазделительПути() + "index.html"; - - Возврат БазовыйФайлРедактора; + Если ДополнительныеПараметры.ФорматИнтеграции = "JSON" Тогда + ЗапросИсходящийОтформатированный = БазовыйФайлРедактора; + ЗапросВходящийОтформатированный = БазовыйФайлРедактора; + ИначеЕсли ДополнительныеПараметры.Дополнение = "Out" Тогда + ЗапросИсходящийОтформатированный = БазовыйФайлРедактора; + Иначе + ЗапросВходящийОтформатированный = БазовыйФайлРедактора; + КонецЕсли; #КонецЕсли -КонецФункции +КонецПроцедуры &НаКлиенте Процедура ИнициализироватьИЗаполнитьТекстомОбъектJSON(ВидОтображения, ТипЗапроса = "") @@ -281,7 +401,7 @@ ДокументВнешнийОбъектИсходящий.destroy(); КонецЕсли; - ДокументВнешнийОбъектИсходящий = Элементы.ЗапросИсходящий.Документ.defaultView.Init(ВидОтображения); + ДокументВнешнийОбъектИсходящий = Элементы.ИсходящееСообщение.Документ.defaultView.Init(ВидОтображения); ДокументВнешнийОбъектИсходящий.setName("Корень"); // Установка имени верхнего уровня для дерева ДокументВнешнийОбъектИсходящий.setText(Объект.ИсходящееСообщение); @@ -290,7 +410,7 @@ ДокументВнешнийОбъектВходящий.destroy(); КонецЕсли; - ДокументВнешнийОбъектВходящий = Элементы.ЗапросВходящий.Документ.defaultView.Init(ВидОтображения); + ДокументВнешнийОбъектВходящий = Элементы.ВходящееСообщение.Документ.defaultView.Init(ВидОтображения); ДокументВнешнийОбъектВходящий.setName("Корень"); // Установка имени верхнего уровня для дерева ДокументВнешнийОбъектВходящий.setText(Объект.ВходящееСообщение); Иначе @@ -298,7 +418,7 @@ ДокументВнешнийОбъектИсходящий.destroy(); КонецЕсли; - ДокументВнешнийОбъектИсходящий = Элементы.ЗапросИсходящий.Документ.defaultView.Init(ВидОтображения); + ДокументВнешнийОбъектИсходящий = Элементы.ИсходящееСообщение.Документ.defaultView.Init(ВидОтображения); ДокументВнешнийОбъектИсходящий.setName("Корень"); // Установка имени верхнего уровня для дерева ДокументВнешнийОбъектИсходящий.setText(Объект.ИсходящееСообщение); @@ -306,9 +426,11 @@ ДокументВнешнийОбъектВходящий.destroy(); КонецЕсли; - ДокументВнешнийОбъектВходящий = Элементы.ЗапросВходящий.Документ.defaultView.Init(ВидОтображения); - ДокументВнешнийОбъектВходящий.setName("Корень"); // Установка имени верхнего уровня для дерева - ДокументВнешнийОбъектВходящий.setText(Объект.ВходящееСообщение); + Если Элементы.ВходящееСообщение.Документ <> Неопределено Тогда + ДокументВнешнийОбъектВходящий = Элементы.ВходящееСообщение.Документ.defaultView.Init(ВидОтображения); + ДокументВнешнийОбъектВходящий.setName("Корень"); // Установка имени верхнего уровня для дерева + ДокументВнешнийОбъектВходящий.setText(Объект.ВходящееСообщение); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -317,19 +439,19 @@ Процедура ИнициализироватьИЗаполнитьТекстомОбъектXML(ТипЗапроса) Если ТипЗапроса = "Исходящий" Тогда - Элементы.ЗапросИсходящий.Документ.defaultView.start( + Элементы.ИсходящееСообщение.Документ.defaultView.start( ОтформатироватьСообщениеИнтеграции(Объект.ИсходящееСообщение), "nerd"); Иначе - Элементы.ЗапросВходящий.Документ.defaultView.start( + Элементы.ВходящееСообщение.Документ.defaultView.start( ОтформатироватьСообщениеИнтеграции(Объект.ВходящееСообщение), "nerd"); КонецЕсли; КонецПроцедуры &НаСервереБезКонтекста -Функция ДвоичныеДанныеМакета(ФорматИнтеграции) +Функция ДвоичныеДанныеМакета(Знач ФорматИнтеграцииСтрокой) - Возврат ПолучитьОбщийМакет("пбп_" + ФорматИнтеграции + "Editor"); + Возврат ПолучитьОбщийМакет("пбп_" + ФорматИнтеграцииСтрокой + "Editor"); КонецФункции @@ -337,9 +459,33 @@ Функция ПолучитьФорматИнтеграции(ФорматИнтеграции) ИндексЗначенияПеречисления = Перечисления.пбп_ФорматыИнтеграций.Индекс(ФорматИнтеграции); - ФорматИнтеграции = Метаданные.Перечисления.пбп_ФорматыИнтеграций.ЗначенияПеречисления[ИндексЗначенияПеречисления].Имя; + ФорматИнтеграцииСтрокой = Метаданные.Перечисления.пбп_ФорматыИнтеграций + .ЗначенияПеречисления[ИндексЗначенияПеречисления].Имя; + + Возврат ФорматИнтеграцииСтрокой; + +КонецФункции + +&НаКлиенте +Процедура ОбработчикВыбораКаталогаСохранениеЗавершениеПослеВыбораВДиалоге( + Результат, Знач ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + + ПутьКФайлу = Результат[0]; + + ДвоичныеДанныеФайла = ОбработчикВыбораКаталогаСохранениеЗавершениеПослеВыбораВДиалогаНаСервере(); + ДвоичныеДанныеФайла.Записать(ПутьКФайлу); + +КонецПроцедуры + +&НаСервере +Функция ОбработчикВыбораКаталогаСохранениеЗавершениеПослеВыбораВДиалогаНаСервере() - Возврат ФорматИнтеграции; + РеквизитОбъект = РеквизитФормыВЗначение("Объект"); + Возврат РеквизитОбъект.ПолучитьДанныеФайлаСообщения(); КонецФункции diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP.xml" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP.xml" new file mode 100644 index 00000000..d1e039c0 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP.xml" @@ -0,0 +1,23 @@ + + + + + пбп_ИнтеграцииFTPSFTP + + + ru + Интеграции с FTP / SFTP + + + + false + false + true + true + false + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP/Ext/Module.bsl" new file mode 100644 index 00000000..5dc2e80f --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270FTPSFTP/Ext/Module.bsl" @@ -0,0 +1,1456 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8, +// включая доработку типовых конфигураций. +// +// Copyright First BIT company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// URL: https://github.com/firstBitSportivnaya/PSSL/ +// + +#Область ПрограммныйИнтерфейс + +// Параметры сообщения FTP / SFTP +// +// Возвращаемое значение: +// Структура - содержит ключи для описания сообщения обмена: +// - Путь - путь к файлу временного хранилища на сервере +// - ИмяФайла - имя файла без расширения +// - Расширение - расширение (файла без точки) +// - ДвоичныеДанные - данные файла. Если ключ "Путь" не заполнен, то его значение будет заполнено +// путем к временному файлу, сохраненного из этих двоичных данных +// +Функция ПараметрыСообщенияFTPSFTP() Экспорт + + Результат = Новый Структура("Путь, ИмяФайла, Расширение, ДвоичныеДанные"); + Возврат Результат; + +КонецФункции + +// Получить структуру параметров подключения к серверу FTP / SFTP +// +// Параметры: +// НастройкаИнтеграции - СправочникСсылка.пбп_НастройкиИнтеграции - настройка интеграции, +// для которой необходимо получить параметры +// +// Возвращаемое значение: +// Структура - Параметры соединения с сервером из настроек интеграции и безопасного хранилища +// +Функция ПолучитьПараметрыПодключенияFTPSFTP(НастройкаИнтеграции) Экспорт + + СтруктураНастроек = пбп_ИнтеграцииСлужебный.ПолучитьСтруктуруНастроекИнтеграции(НастройкаИнтеграции); + + ПараметрыСоединения = ПараметрыСоединенияFTPSFTP(); + ПараметрыСоединения.Адрес = СтруктураНастроек.СтрокаПодключения; + ПараметрыСоединения.Порт = Число(СтруктураНастроек.Порт); + + Если СтруктураНастроек.Свойство("Логин") Тогда + ПараметрыСоединения.Логин = СтруктураНастроек.Логин.Значение; + Иначе + ПараметрыСоединения.Логин = ""; + КонецЕсли; + + Если СтруктураНастроек.Свойство("Пароль") Тогда + ПараметрыСоединения.Пароль = СтруктураНастроек.Пароль.Значение; + Иначе + ПараметрыСоединения.Пароль = ""; + КонецЕсли; + + Возврат ПараметрыСоединения; + +КонецФункции + +#Область FTP + +// Выполнить подключение к FTP-серверу по настройке интеграции +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к FTP-серверу +// +// Возвращаемое значение: +// FTPСоединение, Строка - возвращает FTP-соединение по указанным настройкам, либо строку с описанием ошибки +// +Функция ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока(ИнтеграционныйПоток) Экспорт + + СтруктураРеквизитов = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции, ТочкаВхода"); + + ПараметрыСоединения = ПолучитьПараметрыПодключенияFTPSFTP(СтруктураРеквизитов.НастройкаИнтеграции); + + Порт = ?(Не ЗначениеЗаполнено(ПараметрыСоединения.Порт), 21, ПараметрыСоединения.Порт); + + Таймаут = 0; + + Попытка + FTPСоединение = Новый FTPСоединение(ПараметрыСоединения.Адрес, + Порт, ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, , , Таймаут); + Исключение + ЗаголовокОшибки = "Не удалось установить соединение с FTP-сервером"; + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + + Возврат СообщениеОбОшибке; + КонецПопытки; + + КаталогИсходящие = СтруктураРеквизитов.ТочкаВхода; + КаталогИсходящие = СокрЛП(КаталогИсходящие); + Если Лев(КаталогИсходящие, 1) <> "/" Тогда + КаталогИсходящие = "/" + КаталогИсходящие; + КонецЕсли; + + Если FTPСоединение.ТекущийКаталог() <> КаталогИсходящие Тогда + Попытка + FTPСоединение.УстановитьТекущийКаталог(КаталогИсходящие); + Исключение + ЗаголовокОшибки = "Не удалось установить каталог для исходящих на FTP-сервере"; + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + + Возврат СообщениеОбОшибке; + КонецПопытки; + КонецЕсли; + + Возврат FTPСоединение; + +КонецФункции + +// Отправить сообщение FTP +// +// Параметры: +// ПодключениеКFTP - FTPСоединение- текущее соединение с FTP-сервером +// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) +// +// Возвращаемое значение: +// Строка - описание ошибки +// +Функция ОтправитьСообщениеFTP(ПодключениеКFTP, ПараметрыСообщения) Экспорт + + ЗаголовокОшибки = "Файл не был создан"; + СообщениеОбОшибке = ""; + + Попытка + ИмяФайлаСРасширением = СтрШаблон("%1.%2", ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); + + Если ПустаяСтрока(ПараметрыСообщения.Путь) Тогда + // BSLLS:MissingTemporaryFileDeletion-off + // Необходимо пропустить проверку, так как файл удаляется позже + НовыйФайл = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); + // BSLLS:MissingTemporaryFileDeletion-on + ПараметрыСообщения.Данные.Записать(НовыйФайл); + ПараметрыСообщения.Путь = НовыйФайл; + КонецЕсли; + + ПодключениеКFTP.Записать(ПараметрыСообщения.Путь, ИмяФайлаСРасширением); + + // Повторно проверяем наличие записанного файла + КаталогИсходящие = ПодключениеКFTP.ТекущийКаталог(); + + Если Не ПроверитьФайлЕстьНаFTP(ПодключениеКFTP, ИмяФайлаСРасширением, КаталогИсходящие) Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", + ЗаголовокОшибки, "подробности уточните у администратора системы"); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + КонецЕсли; + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(НовыйФайл); + Исключение + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +// Прочитать сообщение FTP +// +// Параметры: +// ПодключениеКFTP - FTPСоединение- текущее соединение с FTP-сервером +// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) +// +// Возвращаемое значение: +// Строка - описание ошибки +// +Функция ПрочитатьСообщениеFTP(ПодключениеКFTP, ПараметрыСообщения) Экспорт + + ЗаголовокОшибки = "Файл не был получен"; + СообщениеОбОшибке = ""; + + Попытка + ИмяФайлаСРасширением = СтрШаблон("%1.%2", ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); + + // Проверяем наличие получаемого файла + КаталогВходящие = ПодключениеКFTP.ТекущийКаталог(); + + Если Не ПроверитьФайлЕстьНаFTP(ПодключениеКFTP, ИмяФайлаСРасширением, КаталогВходящие) Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", + ЗаголовокОшибки, "искомый файл отсутствует на FTP-сервере"); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + Возврат СообщениеОбОшибке; + КонецЕсли; + + Если ПустаяСтрока(ПараметрыСообщения.Путь) Тогда + // BSLLS:MissingTemporaryFileDeletion-off + // Необходимо пропустить проверку, так как полученный файл должен храниться до его обработки + ПараметрыСообщения.Путь = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); + // BSLLS:MissingTemporaryFileDeletion-on + КонецЕсли; + + ПодключениеКFTP.Получить(ИмяФайлаСРасширением, ПараметрыСообщения.Путь); + Исключение + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +// Проверяет наличие файла на FTP +// +// Параметры: +// FTPСоединение - FTPСоединение - текущее соединение с FTP-сервером +// ИмяФайла - Строка - имя искомого файла +// КаталогПоиска - Строка - каталог поиска файла на FTP-сервере +// ПоТочномуСовпадению - Булево - если Истина, то поиск на равенство, если Ложь - по вхождению +// +// Возвращаемое значение: +// Булево - файл найден +// +Функция ПроверитьФайлЕстьНаFTP(FTPСоединение, ИмяФайла, КаталогПоиска, ПоТочномуСовпадению = Истина) Экспорт + + Результат = Ложь; + + ФайлыНаРесурсе = FTPСоединение.НайтиФайлы(КаталогПоиска); + Для Каждого ФайлНаСервере Из ФайлыНаРесурсе Цикл + Если ПоТочномуСовпадению Тогда + Если ВРег(ФайлНаСервере) = ВРег(ИмяФайла) Тогда + Результат = Истина; + Прервать; + КонецЕсли; + Иначе + Если СтрНайти(ВРег(ФайлНаСервере), ВРег(ИмяФайла), НаправлениеПоиска.СНачала) > 0 Тогда + Результат = Истина; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +#КонецОбласти // FTP + +#Область SFTP + +// Отправляет сообщение на SFTP-сервер. +// Для отправки на ОС Linux используется одна из установленных утилит: +// 1) curl; +// 2) sshpass; +// 4) expect. +// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). +// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. +// +// Для отправки на ОС Windows используется WinSCP. +// +// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка. +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к FTP-серверу +// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) +// СтруктураИстории - Структура - см. ПолучитьСтруктуруЗаписиИстории +// +// Возвращаемое значение: +// Строка - описание ошибки +// +Функция ОтправитьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории) Экспорт + + ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток); + + Если ПустаяСтрока(ПараметрыСообщения.Путь) Тогда + // BSLLS:MissingTemporaryFileDeletion-off + // Необходимо пропустить проверку, так как файл удаляется позже + НовыйФайл = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); + // BSLLS:MissingTemporaryFileDeletion-on + ПараметрыСообщения.Данные.Записать(НовыйФайл); + ПараметрыСообщения.Путь = НовыйФайл; + КонецЕсли; + + СообщениеОбОшибке = ОпределитьТипОтправкиИОтправитьСообщениеНаSFTP( + ПараметрыСоединения, ПараметрыСообщения, СтруктураИстории); + + Возврат СообщениеОбОшибке; + +КонецФункции + +// Получает список файлов с каталога SFTP-сервера. +// Для получения данных на ОС Linux используется одна из установленных утилит: +// 1) curl; +// 2) sshpass; +// 4) expect. +// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). +// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. +// +// Для отправки на ОС Windows используется WinSCP. +// +// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка. +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к FTP-серверу +// КаталогПоиска - Строка - каталог поиска файла на FTP-сервере +// СтруктураИстории - Структура - см. ПолучитьСтруктуруЗаписиИстории +// +// Возвращаемое значение: +// ТаблицаЗначений, Строка - таблица данных файлов (имя файла, дата изменения файла) или описание ошибки +// +Функция ПолучитьСодержимоеКаталогаSFTP(ИнтеграционныйПоток, КаталогПоиска, СтруктураИстории) Экспорт + + ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, Ложь); + ПараметрыСоединения.КаталогИсходящие = КаталогПоиска; + + ФайлыНаРесурсе = ОпределитьТипЧтенияИПрочитатьСодержимоеНаSFTP(ПараметрыСоединения, СтруктураИстории); + + Возврат ФайлыНаРесурсе; + +КонецФункции + +// Проверяет наличие файла на SFTP +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к FTP-серверу +// ИмяФайла - Строка - имя искомого файла +// КаталогПоиска - Строка - каталог поиска файла на FTP-сервере +// ПоТочномуСовпадению - Булево - если Истина, то поиск на равенство, если Ложь - по вхождению +// СтруктураИстории - Структура - см. ПолучитьСтруктуруЗаписиИстории +// +// Возвращаемое значение: +// Булево, Строка - файл найден или описание ошибки +// +Функция ПроверитьФайлЕстьНаSFTP(ИнтеграционныйПоток, ИмяФайла, + КаталогПоиска, ПоТочномуСовпадению = Истина, СтруктураИстории = Неопределено) Экспорт + + Результат = Ложь; + + ФайлыНаРесурсе = ПолучитьСодержимоеКаталогаSFTP(ИнтеграционныйПоток, КаталогПоиска, СтруктураИстории); + + Если ТипЗнч(ФайлыНаРесурсе) = Тип("Строка") Тогда + Возврат ФайлыНаРесурсе; + КонецЕсли; + + МассивИменФайлов = ФайлыНаРесурсе.ВыгрузитьКолонку("ИмяФайла"); + Для Каждого ФайлНаСервере Из МассивИменФайлов Цикл + Если ПоТочномуСовпадению Тогда + Если ВРег(ФайлНаСервере) = ВРег(ИмяФайла) Тогда + Результат = Истина; + Прервать; + КонецЕсли; + Иначе + Если СтрНайти(ВРег(ФайлНаСервере), ВРег(ИмяФайла), НаправлениеПоиска.СНачала) > 0 Тогда + Результат = Истина; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Получает сообщение с SFTP-сервера. +// Путь к полученному файлу будет лежать в ключе "Путь" структуры ПараметрыСообщения. +// +// Для получения файлов на ОС Linux используется одна из установленных утилит: +// 1) curl; +// 2) sshpass; +// 4) expect. +// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). +// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. +// +// Для получения на ОС Windows используется WinSCP. +// +// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка. +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к FTP-серверу +// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) +// СтруктураИстории - Структура - см. ПолучитьСтруктуруЗаписиИстории +// +// Возвращаемое значение: +// Строка - описание ошибки +// +Функция ПрочитатьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории) Экспорт + + ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, , Ложь); + + СообщениеОбОшибке = ОпределитьТипПолученияИПолучитьСообщениеНаSFTP( + ПараметрыСоединения, ПараметрыСообщения, СтруктураИстории); + + Возврат СообщениеОбОшибке; + +КонецФункции + +// Удаляет файл с SFTP-сервера. +// +// Для получения файлов на ОС Linux используется одна из установленных утилит: +// 1) curl; +// 2) sshpass; +// 4) expect. +// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). +// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. +// +// Для получения на ОС Windows используется WinSCP. +// +// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка. +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к SFTP-серверу +// ИмяФайла - Строка - имя удаляемого файла +// КаталогФайла - Строка - каталог файла на сервере +// ПроверитьНаличиеПередУдалением - Булево - если Истина, то перед удалением будет выполнена проверка наличия файла +// СтруктураИстории - Структура - см. ПолучитьСтруктуруЗаписиИстории +// +// Возвращаемое значение: +// Строка - описание ошибки +// +Функция УдалитьФайлSFTP(ИнтеграционныйПоток, ИмяФайла, + КаталогФайла, ПроверитьНаличиеПередУдалением, СтруктураИстории) Экспорт + + Если ПроверитьНаличиеПередУдалением Тогда + ФайлЕстьИлиОшибка = ПроверитьФайлЕстьНаSFTP(ИнтеграционныйПоток, ИмяФайла, КаталогФайла); + + Если ТипЗнч(ФайлЕстьИлиОшибка) = Тип("Строка") Или Не ФайлЕстьИлиОшибка Тогда + Возврат ФайлЕстьИлиОшибка; + КонецЕсли; + КонецЕсли; + + ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, Ложь); + ПараметрыСоединения.КаталогИсходящие = КаталогФайла; + + СообщениеОбОшибке = ОпределитьТипУдаленияИУдалитьФайлСSFTP( + ПараметрыСоединения, ИмяФайла, СтруктураИстории); + + Возврат СообщениеОбОшибке; + +КонецФункции + +#КонецОбласти // SFTP + +#КонецОбласти // ПрограммныйИнтерфейс + +#Область СлужебныеПроцедурыИФункции + +Функция ПараметрыСоединенияFTPSFTP() + + Результат = Новый Структура("Адрес, Порт, Логин, Пароль, КаталогВходящие, КаталогИсходящие"); + Возврат Результат; + +КонецФункции + +Функция ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, + ЗаполнитьКаталог = Истина, ИсходящееСообщение = Истина) + + СтруктураРеквизитов = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции, ТочкаВхода"); + + ПараметрыСоединения = ПолучитьПараметрыПодключенияFTPSFTP(СтруктураРеквизитов.НастройкаИнтеграции); + + Если ЗаполнитьКаталог Тогда + Каталог = СокрЛП(СтруктураРеквизитов.ТочкаВхода); + Если Лев(Каталог, 1) <> "/" Тогда + Каталог = "/" + Каталог; + КонецЕсли; + + Если Прав(Каталог, 1) <> "/" Тогда + Каталог = Каталог + "/"; + КонецЕсли; + + Если ИсходящееСообщение Тогда + ПараметрыСоединения.КаталогИсходящие = Каталог; + Иначе + ПараметрыСоединения.КаталогВходящие = Каталог; + КонецЕсли; + КонецЕсли; + + Возврат ПараметрыСоединения; + +КонецФункции + +Функция ПолучитьТекстСкриптаБезДанныхАутентификации(ПараметрыСоединения, ТекстСкрипта) + + ТекстСкриптаБезДанныхАутентификации = СтрЗаменить(ТекстСкрипта, ПараметрыСоединения.Логин + ":", "***:"); + ТекстСкриптаБезДанныхАутентификации = СтрЗаменить(ТекстСкриптаБезДанныхАутентификации, + ":" + ПараметрыСоединения.Пароль, ":***"); + ТекстСкриптаБезДанныхАутентификации = СтрЗаменить(ТекстСкриптаБезДанныхАутентификации, + """" + ПараметрыСоединения.Пароль, """***"); + + Возврат ТекстСкриптаБезДанныхАутентификации; + +КонецФункции + +#Область SFTP + +Функция ОпределитьТипОтправкиИОтправитьСообщениеНаSFTP( + ПараметрыСоединения, ПараметрыСообщения, СтруктураИстории) + + ЗаголовокОшибки = "Файл не был отправлен на SFTP-сервер"; + СообщениеОбОшибке = ""; + + ПутьФайлаНаСервере = СтрШаблон("%1%2.%3", ПараметрыСоединения.КаталогИсходящие, + ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); + + ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); + + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПараметрыСообщения.Путь, ПутьФайлаНаСервере); + Если ПустаяСтрока(ТекстСкрипта) Тогда + Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); + КонецЕсли; + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); + Если ЭтоLinuxСервер Тогда + РасширениеФайлаСкрипта = "sh"; + Иначе + РасширениеФайлаСкрипта = "bat"; + КонецЕсли; + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); + + СообщениеОбОшибке = ВыполнитьКомандуСистемыПриПолученииИлиОтправке( + ЭтоLinuxСервер, ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки, СтруктураИстории); + + Если СтруктураИстории <> Неопределено Тогда + СтруктураИстории.ИсходящееСообщение = ПолучитьТекстСкриптаБезДанныхАутентификации( + ПараметрыСоединения, ТекстСкрипта); + КонецЕсли; + + Возврат СообщениеОбОшибке; + +КонецФункции + +Функция ОпределитьТипЧтенияИПрочитатьСодержимоеНаSFTP(ПараметрыСоединения, СтруктураИстории) + + ЗаголовокОшибки = "Не удалось получить содержимое папки SFTP-сервера"; + СообщениеОбОшибке = ""; + + // BSLLS:MissingTemporaryFileDeletion-off + ПутьКФайлуСодержимого = ПолучитьИмяВременногоФайла("txt"); + // BSLLS:MissingTemporaryFileDeletion-on + + ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); + + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговПоТипуОС( + ЭтоLinuxСервер, ПараметрыСоединения, ПутьКФайлуСодержимого); + Если ПустаяСтрока(ТекстСкрипта) Тогда + Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); + КонецЕсли; + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); + Если ЭтоLinuxСервер Тогда + РасширениеФайлаСкрипта = "sh"; + Иначе + РасширениеФайлаСкрипта = "bat"; + КонецЕсли; + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); + + ИмяСлужебногоФайла = ""; + + Попытка + Если ЭтоLinuxСервер Тогда + ЭтоExpect = СтрНайти(ТекстСкрипта, "expect") > 0; + Если ЭтоExpect Тогда + ВспомогательныйСкрипт = СтрШаблон("#!/bin/bash + | + |expect %1 > %2", ИмяФайлаСкрипта, ПутьКФайлуСодержимого); + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ВспомогательныйСкрипт); + // BSLLS:MissingTemporaryFileDeletion-off + ИмяСлужебногоФайла = ПолучитьИмяВременногоФайла("sh"); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяСлужебногоФайла); + + ИтоговаяКоманда = "sh """ + ИмяСлужебногоФайла + """"; + Иначе + ИтоговаяКоманда = "sh """ + ИмяФайлаСкрипта + """"; + КонецЕсли; + Иначе + ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; + КонецЕсли; + + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + Если СтруктураИстории <> Неопределено Тогда + НачалоВызова = ТекущаяДатаСеанса(); + КонецЕсли; + // BSLLS:ExternalAppStarting-off + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); + // BSLLS:ExternalAppStarting-on + Если СтруктураИстории <> Неопределено Тогда + СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; + СтруктураИстории.ПротоколОбмена = ПолучитьТекстСкриптаБезДанныхАутентификации(ПараметрыСоединения, ТекстСкрипта); + КонецЕсли; + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяФайлаСкрипта); + + Если Не ПустаяСтрока(ИмяСлужебногоФайла) Тогда + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяСлужебногоФайла); + КонецЕсли; + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта, ИмяСлужебногоФайла); + + Если Результат.КодВозврата <> 0 Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, + "не удалось выполнить команду системы, код возврата", Результат.КодВозврата); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + + Возврат СообщениеОбОшибке; + КонецЕсли; + + ТаблицаФайлов = ПолучитьТаблицуФайловСодержимогоSFTPСервера(ПутьКФайлуСодержимого); + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ПутьКФайлуСодержимого); + + Возврат ТаблицаФайлов; + Исключение + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта, ИмяСлужебногоФайла); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +Функция ОпределитьТипПолученияИПолучитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения, СтруктураИстории) + + ЗаголовокОшибки = "Файл не был получен с SFTP-сервера"; + СообщениеОбОшибке = ""; + + ПутьФайлаНаСервере = СтрШаблон("%1%2.%3", ПараметрыСоединения.КаталогВходящие, + ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); + // BSLLS:MissingTemporaryFileDeletion-off + // Файл не должен удаляться, так как после получения с SFTP-сервера передается в обработку + ПараметрыСообщения.Путь = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); + // BSLLS:MissingTemporaryFileDeletion-on + + ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); + + ТекстСкрипта = ПолучитьТекстСкриптаПолученияПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПараметрыСообщения.Путь, ПутьФайлаНаСервере); + Если ПустаяСтрока(ТекстСкрипта) Тогда + Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); + КонецЕсли; + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); + Если ЭтоLinuxСервер Тогда + РасширениеФайлаСкрипта = "sh"; + Иначе + РасширениеФайлаСкрипта = "bat"; + КонецЕсли; + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); + + СообщениеОбОшибке = ВыполнитьКомандуСистемыПриПолученииИлиОтправке( + ЭтоLinuxСервер, ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки, СтруктураИстории); + + Если СтруктураИстории <> Неопределено Тогда + СтруктураИстории.ИсходящееСообщение = ПолучитьТекстСкриптаБезДанныхАутентификации( + ПараметрыСоединения, ТекстСкрипта); + КонецЕсли; + + Возврат СообщениеОбОшибке; + +КонецФункции + +Функция ОпределитьТипУдаленияИУдалитьФайлСSFTP(ПараметрыСоединения, ИмяФайла, СтруктураИстории) + + ЗаголовокОшибки = "Не удалось удалить файл из папки SFTP-сервера"; + СообщениеОбОшибке = ""; + + ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); + + ПолныйПутьКФайлу = ПараметрыСоединения.КаталогИсходящие; + Если Прав(ПолныйПутьКФайлу, 1) <> "/" Тогда + ПолныйПутьКФайлу = ПолныйПутьКФайлу + "/"; + КонецЕсли; + + ПолныйПутьКФайлу = ПолныйПутьКФайлу + ИмяФайла; + + ТекстСкрипта = ПолучитьТекстСкриптаУдаленияФайлаПоТипуОС( + ЭтоLinuxСервер, ПараметрыСоединения, ПолныйПутьКФайлу); + Если ПустаяСтрока(ТекстСкрипта) Тогда + Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); + КонецЕсли; + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); + Если ЭтоLinuxСервер Тогда + РасширениеФайлаСкрипта = "sh"; + Иначе + РасширениеФайлаСкрипта = "bat"; + КонецЕсли; + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); + + ИмяСлужебногоФайла = ""; + + Попытка + Если ЭтоLinuxСервер Тогда + ЭтоExpect = СтрНайти(ТекстСкрипта, "expect") > 0; + Если ЭтоExpect Тогда + ИтоговаяКоманда = "expect """ + ИмяФайлаСкрипта + """"; + Иначе + ИтоговаяКоманда = "sh """ + ИмяФайлаСкрипта + """"; + КонецЕсли; + Иначе + ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; + КонецЕсли; + + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + Если СтруктураИстории <> Неопределено Тогда + НачалоВызова = ТекущаяДатаСеанса(); + КонецЕсли; + // BSLLS:ExternalAppStarting-off + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); + // BSLLS:ExternalAppStarting-on + Если СтруктураИстории <> Неопределено Тогда + СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; + СтруктураИстории.ПротоколОбмена = ПолучитьТекстСкриптаБезДанныхАутентификации(ПараметрыСоединения, ТекстСкрипта); + КонецЕсли; + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяФайлаСкрипта); + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта, ИмяСлужебногоФайла); + + Если Результат.КодВозврата <> 0 Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, + "не удалось выполнить команду системы, код возврата", Результат.КодВозврата); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + КонецЕсли; + Исключение + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта, ИмяСлужебногоФайла); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +Функция ВыполнитьКомандуСистемыПриПолученииИлиОтправке(ЭтоLinuxСервер, + ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки, СтруктураИстории) + + Попытка + Если ЭтоLinuxСервер Тогда + Если СтрНайти(ТекстСкрипта, "expect") > 0 Тогда + ИтоговаяКоманда = "expect """ + ИмяФайлаСкрипта + """"; + Иначе + ИтоговаяКоманда = "sh """ + ИмяФайлаСкрипта + """"; + КонецЕсли; + Иначе + ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; + КонецЕсли; + + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + Если СтруктураИстории <> Неопределено Тогда + НачалоВызова = ТекущаяДатаСеанса(); + КонецЕсли; + // BSLLS:ExternalAppStarting-off + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); + // BSLLS:ExternalAppStarting-on + Если СтруктураИстории <> Неопределено Тогда + СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; + КонецЕсли; + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта); + + Если Результат.КодВозврата <> 0 Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, + "не удалось выполнить команду системы, код возврата", Результат.КодВозврата); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + КонецЕсли; + Исключение + СообщениеОбОшибке = пбп_ИнтеграцииСервер.ПолучитьПодробноеПредставлениеОшибкиИсключения( + ЗаголовокОшибки, ИнформацияОбОшибке()); + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +Процедура УдалитьВременныеФайлыСкриптов(ИмяОсновногоФайла, Знач ИмяВторогоФайла = "") + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяОсновногоФайла); + + Если Не ПустаяСтрока(ИмяВторогоФайла) Тогда + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяВторогоФайла); + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер) + + Если ЭтоLinuxСервер Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, + "Не найдено ни одной установленной утилиты подключения к SFTP (curl, sshpass, expect)"); + Иначе + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, + "Не найдено утилиты подключения к SFTP - WinSCP"); + КонецЕсли; + + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + + Возврат СообщениеОбОшибке; + +КонецФункции + +Функция ПолучитьТекстСкриптаОтправкиПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере) + + Если ЭтоLinuxСервер Тогда + ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); + + Если ИмяУтилиты = "curl" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиCURL( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + ИначеЕсли ИмяУтилиты = "sshpass" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиSSHPASS( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + ИначеЕсли ИмяУтилиты = "expect" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиEXPECT( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + Иначе + УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); + + Если УтилитаУстановлена Тогда + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиДляWinSCP(ПараметрыСоединения); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + КонецЕсли; + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаСодержимогоКаталоговПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПутьЛокальногоФайла) + + Если ЭтоLinuxСервер Тогда + ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); + + Если ИмяУтилиты = "curl" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговCURL( + ПараметрыСоединения, ПутьЛокальногоФайла); + ИначеЕсли ИмяУтилиты = "sshpass" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговSSHPASS( + ПараметрыСоединения, ПутьЛокальногоФайла); + ИначеЕсли ИмяУтилиты = "expect" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговEXPECT( + ПараметрыСоединения, ПутьЛокальногоФайла); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + Иначе + УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); + + Если УтилитаУстановлена Тогда + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговДляWinSCP(ПараметрыСоединения); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + КонецЕсли; + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере) + + Если ЭтоLinuxСервер Тогда + ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); + + Если ИмяУтилиты = "curl" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаПолученияCURL( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + ИначеЕсли ИмяУтилиты = "sshpass" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаПолученияSSHPASS( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + ИначеЕсли ИмяУтилиты = "expect" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаПолученияEXPECT( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + Иначе + УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); + + Если УтилитаУстановлена Тогда + ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляWinSCP(ПараметрыСоединения); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + КонецЕсли; + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаУдаленияФайлаПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПолныйПутьКФайлу) + + Если ЭтоLinuxСервер Тогда + ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); + + Если ИмяУтилиты = "curl" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаУдаленияФайлаCURL( + ПараметрыСоединения, ПолныйПутьКФайлу); + ИначеЕсли ИмяУтилиты = "sshpass" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаУдаленияФайлаSSHPASS( + ПараметрыСоединения, ПолныйПутьКФайлу); + ИначеЕсли ИмяУтилиты = "expect" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаУдаленияФайлаEXPECT( + ПараметрыСоединения, ПолныйПутьКФайлу); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + Иначе + УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); + + Если УтилитаУстановлена Тогда + ТекстСкрипта = ПолучитьТекстСкриптаУдаленияФайлаДляWinSCP(ПараметрыСоединения); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + КонецЕсли; + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТаблицуФайловСодержимогоSFTPСервера(ПутьКФайлуСодержимого) + + ТаблицаФайлов = ИнициализироватьТаблицуФайловSFTP(); + ТаблицаСвойствФайлов = ИнициализироватьТаблицуСвойствФайловSFTP(); + + ЧтениеФайла = Новый ЧтениеТекста(ПутьКФайлуСодержимого); + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + Пока ТекущаяСтрока <> Неопределено Цикл + Если Лев(ТекущаяСтрока, 1) = "-" Тогда + ЗаполнитьСвойстваФайловИзСтрокиСпискаФайлов(ТаблицаСвойствФайлов, ТекущаяСтрока); + КонецЕсли; + + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + КонецЦикла; + + Для Каждого СтрокаСвойств Из ТаблицаСвойствФайлов Цикл + НовыйОписаниеФайла = ТаблицаФайлов.Добавить(); + НовыйОписаниеФайла.ИмяФайла = СтрокаСвойств.ИмяФайла; + НовыйОписаниеФайла.ДатаИзменения = ПолучитьДатуИзТестовогоФорматаBASHLinux(СтрокаСвойств); + КонецЦикла; + + Возврат ТаблицаФайлов; + +КонецФункции + +Функция ИнициализироватьТаблицуФайловSFTP() + + ТаблицаФайлов = Новый ТаблицаЗначений; + + ДлинаИмениФайла = 150; + ОписаниеТипаДатаВремя = Новый ОписаниеТипов("Дата", , , , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)); + + ТаблицаФайлов.Колонки.Добавить("ИмяФайла", пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаИмениФайла)); + ТаблицаФайлов.Колонки.Добавить("ДатаИзменения", ОписаниеТипаДатаВремя); + + Возврат ТаблицаФайлов; + +КонецФункции + +Функция ИнициализироватьТаблицуСвойствФайловSFTP() + + ТаблицаСвойствФайлов = Новый ТаблицаЗначений; + + // BSLLS:MagicNumber-off + ТаблицаСвойствФайлов.Колонки.Добавить("Права", пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(30)); + ТаблицаСвойствФайлов.Колонки.Добавить("КоличествоСсылок", + пбп_ОбщегоНазначенияСервер.ОписаниеТипаЧисло(3, 0, ДопустимыйЗнак.Неотрицательный)); + ТаблицаСвойствФайлов.Колонки.Добавить("Владелец", пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(50)); + ТаблицаСвойствФайлов.Колонки.Добавить("Группа", пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(50)); + ТаблицаСвойствФайлов.Колонки.Добавить("Размер", + пбп_ОбщегоНазначенияСервер.ОписаниеТипаЧисло(15, 0, ДопустимыйЗнак.Неотрицательный)); + ТаблицаСвойствФайлов.Колонки.Добавить("Месяц", пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(10)); + ТаблицаСвойствФайлов.Колонки.Добавить("Число", + пбп_ОбщегоНазначенияСервер.ОписаниеТипаЧисло(2, 0, ДопустимыйЗнак.Неотрицательный)); + ТаблицаСвойствФайлов.Колонки.Добавить("ГодВремя", пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(5)); + ТаблицаСвойствФайлов.Колонки.Добавить("ЭтоВремя", Новый ОписаниеТипов("Булево")); + ТаблицаСвойствФайлов.Колонки.Добавить("ИмяФайла", пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(150)); + // BSLLS:MagicNumber-on + + Возврат ТаблицаСвойствФайлов; + +КонецФункции + +Процедура ЗаполнитьСвойстваФайловИзСтрокиСпискаФайлов(ТаблицаСвойствФайлов, ТекущаяСтрока) + + МассивСвойств = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекущаяСтрока, " ", Истина, Истина); + Инкремент = 0; + ИмяФайла = ""; + НоваяСтрока = ТаблицаСвойствФайлов.Добавить(); + Для Каждого СтрокаСвойств Из МассивСвойств Цикл + ТекущееЗначение = СтрокаСвойств; + // BSLLS:MagicNumber-off + Если Инкремент = 0 Тогда + ИмяКолонки = "Права"; + ИначеЕсли Инкремент = 1 Тогда + ИмяКолонки = "КоличествоСсылок"; + ТекущееЗначение = Число(ТекущееЗначение); + ИначеЕсли Инкремент = 2 Тогда + ИмяКолонки = "Владелец"; + ИначеЕсли Инкремент = 3 Тогда + ИмяКолонки = "Группа"; + ИначеЕсли Инкремент = 4 Тогда + ИмяКолонки = "Размер"; + ТекущееЗначение = Число(ТекущееЗначение); + ИначеЕсли Инкремент = 5 Тогда + ИмяКолонки = "Месяц"; + ИначеЕсли Инкремент = 6 Тогда + ИмяКолонки = "Число"; + ТекущееЗначение = Число(ТекущееЗначение); + ИначеЕсли Инкремент = 7 Тогда + ИмяКолонки = "ГодВремя"; + НоваяСтрока.ЭтоВремя = СтрНайти(ТекущееЗначение, ":") > 0; + Иначе + ИмяФайла = ИмяФайла + ?(ПустаяСтрока(ИмяФайла), "", " ") + ТекущееЗначение; + КонецЕсли; + + // Далее должно быть имя файла + Если Инкремент <= 7 Тогда + НоваяСтрока[ИмяКолонки] = ТекущееЗначение; + КонецЕсли; + // BSLLS:MagicNumber-on + + Инкремент = Инкремент + 1; + КонецЦикла; + + НоваяСтрока.ИмяФайла = ИмяФайла; + +КонецПроцедуры + +Функция ПолучитьДатуИзТестовогоФорматаBASHLinux(СтрокаСвойств) + + ГодЧислом = ?(СтрокаСвойств.ЭтоВремя, Год(ТекущаяДатаСеанса()), Число(СтрокаСвойств.ГодВремя)); + Месяц = ПолучитьНомерМесяцаПоСтроковомуПредставлению(СтрокаСвойств.Месяц); + ЧислоМесяца = СтрокаСвойств.Число; + + ЧасВремя = ?(СтрокаСвойств.ЭтоВремя, СтрокаСвойств.ГодВремя, "00:00"); + + МассивЧасВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ЧасВремя, ":"); + + ДатаИзменения = Дата(ГодЧислом, Месяц, ЧислоМесяца, МассивЧасВремя[0], МассивЧасВремя[1], 0); + + Возврат ДатаИзменения; + +КонецФункции + +Функция ПолучитьНомерМесяцаПоСтроковомуПредставлению(МесяцСтрокойСокр) + + МесяцВРег = ВРег(МесяцСтрокойСокр); + // BSLLS:Typo-off + Если МесяцВРег = "ЯНВ" + Или МесяцВРег = "JAN" Тогда + МесяцЧислом = 1; + ИначеЕсли МесяцВРег = "ФЕВ" + Или МесяцВРег = "FEB" Тогда + МесяцЧислом = 2; + ИначеЕсли МесяцВРег = "МАР" + Или МесяцВРег = "MAR" Тогда + МесяцЧислом = 3; + ИначеЕсли МесяцВРег = "АПР" + Или МесяцВРег = "APR" Тогда + МесяцЧислом = 4; + ИначеЕсли МесяцВРег = "МАЙ" + Или МесяцВРег = "MAY" Тогда + МесяцЧислом = 5; + ИначеЕсли МесяцВРег = "ИЮН" + Или МесяцВРег = "JUN" Тогда + МесяцЧислом = 6; + ИначеЕсли МесяцВРег = "ИЮЛ" + Или МесяцВРег = "JUL" Тогда + МесяцЧислом = 7; + ИначеЕсли МесяцВРег = "АВГ" + Или МесяцВРег = "AUG" Тогда + МесяцЧислом = 8; + ИначеЕсли МесяцВРег = "СЕН" + Или МесяцВРег = "SEP" Тогда + МесяцЧислом = 9; + ИначеЕсли МесяцВРег = "ОКТ" + Или МесяцВРег = "OCT" Тогда + МесяцЧислом = 10; + ИначеЕсли МесяцВРег = "НОЯ" + Или МесяцВРег = "NOV" Тогда + МесяцЧислом = 11; + Иначе // Декабрь + МесяцЧислом = 12; + КонецЕсли; + // BSLLS:Typo-on + + Возврат МесяцЧислом; + +КонецФункции + +#Область SFTPWindows + +Функция ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows() + + Возврат Ложь; + +КонецФункции + +Функция ПолучитьТекстСкриптаОтправкиДляWinSCP(ПараметрыСоединения) + + Возврат ""; + +КонецФункции + +Функция ПолучитьТекстСкриптаСодержимогоКаталоговДляWinSCP(ПараметрыСоединения) + + Возврат ""; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияДляWinSCP(ПараметрыСоединения) + + Возврат ""; + +КонецФункции + +Функция ПолучитьТекстСкриптаУдаленияФайлаДляWinSCP(ПараметрыСоединения) + + Возврат ""; + +КонецФункции + +#КонецОбласти // SFTPWindows + +#Область SFTPLinux + +Функция ПолучитьИмяУтилитыПодключенияКSFTPLinux() + + ИмяУстановленнойУтилиты = ""; + + МассивИменУтилит = Новый Массив; + МассивИменУтилит.Добавить("curl"); + МассивИменУтилит.Добавить("sshpass"); + МассивИменУтилит.Добавить("expect"); + + Для Каждого ИмяУтилиты Из МассивИменУтилит Цикл + Если ПроверитьСуществованиеУтилитыПодключенияКSFTPLinux(ИмяУтилиты) Тогда + ИмяУстановленнойУтилиты = ИмяУтилиты; + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат ИмяУстановленнойУтилиты; + +КонецФункции + +Функция ПроверитьСуществованиеУтилитыПодключенияКSFTPLinux(ИмяУтилиты) + + РезультатПроверки = Ложь; + + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаПроверки = ПолучитьИмяВременногоФайла("txt"); + // BSLLS:MissingTemporaryFileDeletion-on + + КомандаПроверки = СтрШаблон("command -v %1 > %2", ИмяУтилиты, ИмяФайлаПроверки); + + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + // BSLLS:ExternalAppStarting-off + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(КомандаПроверки, ПараметрыЗапускаКоманды); + // BSLLS:ExternalAppStarting-on + + Если Результат.КодВозврата = 0 Тогда + ЧтениеФайла = Новый ЧтениеТекста(ИмяФайлаПроверки); + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + Если ТекущаяСтрока <> Неопределено Тогда + РезультатПроверки = Истина; + КонецЕсли; + КонецЕсли; + + УдалитьВременныеФайлыСкриптов(ИмяФайлаПроверки); + + Возврат РезультатПроверки; + +КонецФункции + +#Область CURL + +Функция ПолучитьТекстСкриптаОтправкиCURL(ПараметрыСоединения, ПутьОтправляемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/bash + | + |curl -k ""sftp://%1%2"" --user ""%3:%4"" -T %5"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПутьФайлаНаСервере, + ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьОтправляемогоФайла); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаСодержимогоКаталоговCURL(ПараметрыСоединения, ПутьКФайлуСодержимогоКаталога) + + ТекстСкрипта = "#!/usr/bin/bash + | + |curl -k ""sftp://%1%2"" --user ""%3:%4"" > %5"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПараметрыСоединения.КаталогИсходящие, + ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьКФайлуСодержимогоКаталога); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияCURL(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/bash + | + |curl -k ""sftp://%1%2"" --user ""%3:%4"" -o %5"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПутьФайлаНаСервере, + ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьСохраняемогоФайла); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаУдаленияФайлаCURL(ПараметрыСоединения, ПолныйПутьКФайлу) + + ТекстСкрипта = "#!/usr/bin/bash + | + |curl -k ""sftp://%1:%2"" --user ""%3:%4"" -Q ""rm %5"""; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, + ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, + ПараметрыСоединения.Пароль, ПолныйПутьКФайлу); + + Возврат ТекстСкрипта; + +КонецФункции + +#КонецОбласти // CURL + +#Область SSHPASS + +Функция ПолучитьТекстСкриптаОтправкиSSHPASS(ПараметрыСоединения, ПутьОтправляемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/bash + | + |HOST=""%1"" + |USERNAME=""%2"" + |PASSWORD=""%3"" + |PORT=%4 + | + |sshpass -p ""$PASSWORD"" sftp -oPort=$PORT $USERNAME@$HOST < %6"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПараметрыСоединения.Логин, + ПараметрыСоединения.Пароль, ПараметрыСоединения.Порт, ПараметрыСоединения.КаталогИсходящие, + ПутьКФайлуСодержимогоКаталога); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияSSHPASS(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/bash + | + |HOST=""%1"" + |USERNAME=""%2"" + |PASSWORD=""%3"" + |PORT=%4 + | + |sshpass -p ""$PASSWORD"" sftp -oPort=$PORT $USERNAME@$HOST <"" + |send ""put %5 %6\n"" + |expect ""sftp>"" + |send ""exit\n"" + |interact"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, + ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПутьОтправляемогоФайла, ПутьФайлаНаСервере); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаСодержимогоКаталоговEXPECT(ПараметрыСоединения, ПутьКФайлуСодержимогоКаталога) + + ТекстСкрипта = "#!/usr/bin/expect + | + |spawn sftp -P %1 %2@%3 + |expect ""%2@%3's password:"" + |send ""%4\n"" + |expect ""sftp>"" + |send ""ls -l %5\n"" + |expect ""sftp>"" + |send ""exit\n"" + |interact"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, + ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПараметрыСоединения.КаталогИсходящие); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияEXPECT(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/expect + | + |spawn sftp -P %1 %2@%3 + |expect ""%2@%3's password:"" + |send ""%4\n"" + |expect ""sftp>"" + |send ""get %5 %6\n"" + |expect ""sftp>"" + |send ""exit\n"" + |interact"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, + ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПутьФайлаНаСервере, ПутьСохраняемогоФайла); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаУдаленияФайлаEXPECT(ПараметрыСоединения, ПолныйПутьКФайлу) + + ТекстСкрипта = "#!/usr/bin/expect + | + |spawn sftp -P %1 %2@%3 + |expect ""%2@%3's password:"" + |send ""%4\n"" + |expect ""sftp>"" + |send ""rm %5\n"" + |expect ""sftp>"" + |send ""exit\n"" + |interact"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, + ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, + ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, + ПолныйПутьКФайлу); + + Возврат ТекстСкрипта; + +КонецФункции + +#КонецОбласти // EXPECT + +#КонецОбласти // SFTPLinux + +#КонецОбласти // SFTP + +#КонецОбласти // СлужебныеПроцедурыИФункции \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" index 28eaf418..9fed4fac 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" @@ -20,91 +20,7 @@ #Область ПрограммныйИнтерфейс -// Процедура создает запись справочника История интеграции с информацией о событии интеграции -// -// Параметры: -// СтруктураЗаписиИстории - Структура - описание действия повлекшего ошибку -// ЭтоЗагрузка - Булево - Истина если это Загрузка, Ложь если это Выгрузка -// -Процедура СоздатьСообщениеИсторииИнтеграции(СтруктураЗаписиИстории, ЭтоЗагрузка) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ДополнительноОбработатьЗапросыИнтеграцииПередЗаписьюВИсторию(СтруктураЗаписиИстории); - - НовоеСообщение = Справочники.пбп_ИсторияИнтеграции.СоздатьЭлемент(); - НовоеСообщение.ДатаИнтеграции = ТекущаяДатаСеанса(); - НовоеСообщение.ДатаИнтеграцииВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах(); - НовоеСообщение.Код = Новый УникальныйИдентификатор(); - НовоеСообщение.Ошибка = ЗначениеЗаполнено(СтруктураЗаписиИстории.ОписаниеОшибки); - НовоеСообщение.Пользователь = пбп_ПользователиСлужебный.ТекущийПользователь(); - НовоеСообщение.ДлительностьОбмена = НовоеСообщение.ДатаИнтеграции - СтруктураЗаписиИстории.ДатаНачалаИнтеграции; - НовоеСообщение.ДлительностьВызова = СтруктураЗаписиИстории.ДлительностьВызова; - Если ЭтоЗагрузка Тогда - Если НовоеСообщение.Ошибка Тогда - НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.ОшибкаЗагрузки; - Иначе - НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.Загружено; - КонецЕсли; - Иначе - Если НовоеСообщение.Ошибка Тогда - НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.ОшибкаВыгрузки; - Иначе - НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.Выгружено; - КонецЕсли; - КонецЕсли; - ЗаполнитьЗначенияСвойств(НовоеСообщение, СтруктураЗаписиИстории); - Для Каждого Строка Из СтруктураЗаписиИстории.ОбъектыИнтеграции Цикл - НоваяСтрока = НовоеСообщение.ОбъектыИнтеграции.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); - КонецЦикла; - - НовоеСообщение.Записать(); - -КонецПроцедуры - -// Функция возвращает структуру со всеми необходимыми значениями для заполнения записи истории интеграции -// -// Возвращаемое значение: -// Строка -Функция ПолучитьСтруктуруЗаписиИстории() Экспорт - - СтруктураЗаписиИстории = Новый Структура; - СтруктураЗаписиИстории.Вставить("ИнтеграционныйПоток", ""); - СтруктураЗаписиИстории.Вставить("ВходящееСообщение", ""); - СтруктураЗаписиИстории.Вставить("ИсходящееСообщение", ""); - СтруктураЗаписиИстории.Вставить("ИнтегрируемаяСистема", Неопределено); - СтруктураЗаписиИстории.Вставить("ОписаниеОшибки", ""); - СтруктураЗаписиИстории.Вставить("ПротоколОбмена", ""); - СтруктураЗаписиИстории.Вставить("ДатаНачалаИнтеграции", ТекущаяДатаСеанса()); - СтруктураЗаписиИстории.Вставить("ДлительностьВызова", 0); - СтруктураЗаписиИстории.Вставить("ФорматИнтеграции", Перечисления.пбп_ФорматыИнтеграций.XML); - ОбъектыИнтеграции = Новый ТаблицаЗначений; - ОбъектыИнтеграции.Колонки.Добавить("ОбъектИнтеграции"); - ОбъектыИнтеграции.Колонки.Добавить("СозданОбновлен"); - СтруктураЗаписиИстории.Вставить("ОбъектыИнтеграции", ОбъектыИнтеграции); - - Возврат СтруктураЗаписиИстории; - -КонецФункции - -// Процедура добавляет сообщения в протокол обмена через указанный разделитель -// -// Параметры: -// СтруктураОтвета - Структура - см. ИнтеграцииСервер.ПолучитьСтруктуруЗаписиИстории -// ТекстСообщения - Строка - Текст, который будет записан в протокол обмена -// Разделитель - Строка - Разделитель записей -Процедура ДобавитьЗаписьВПротоколОбмена(СтруктураОтвета, ТекстСообщения, Разделитель = "") Экспорт - - Если ПустаяСтрока(Разделитель) Тогда - Разделитель = ";" + Символы.ПС; - КонецЕсли; - - ВыводРазделителя = ?(ПустаяСтрока(СтруктураОтвета.ПротоколОбмена), "", Разделитель); - - СтруктураОтвета.ПротоколОбмена = СтруктураОтвета.ПротоколОбмена + ВыводРазделителя + НСтр(ТекстСообщения); - -КонецПроцедуры +#Область ОбщегоНазначения // Функция форматирует XML запрос в строковом виде для удобного чтения // @@ -131,47 +47,6 @@ КонецФункции -// Функция возвращает структуру с настройками для интеграции -// -// Параметры: -// НастройкаИнтеграции - СправочникСсылка.пбп_НастройкиИнтеграции - Ссылка на элемент справочника Настройки интеграции -// Возвращаемое значение: -// Структура -Функция ПолучитьСтруктуруНастроекИнтеграции(НастройкаИнтеграции) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - СтруктураНастроек = пбп_ОбщегоНазначенияСлужебный.ЗначенияРеквизитовОбъекта( - НастройкаИнтеграции, "СтрокаПодключения, Порт, ИмяОбъекта"); - ДанныеБезопасногоХранилища = пбп_ОбщегоНазначенияСлужебный.ПрочитатьДанныеИзБезопасногоХранилища(НастройкаИнтеграции); - - Для Каждого КлючИЗначение Из ДанныеБезопасногоХранилища Цикл - СтруктураНастроек.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); - КонецЦикла; - - УстановитьПривилегированныйРежим(Ложь); - - Возврат СтруктураНастроек; - -КонецФункции - -// Функция возвращает структуру с настройками для интеграции -// -// Параметры: -// МетодИнтеграции - СправочникСсылка.пбп_МетодыИнтеграции - Ссылка на элемент справочника Методы интеграции -// Возвращаемое значение: -// Структура -Функция ПолучитьСтруктуруМетодаИНастроекИнтеграции(МетодИнтеграции) Экспорт - - СтруктураМетодаИНастроек = пбп_ОбщегоНазначенияСлужебный.ЗначенияРеквизитовОбъекта( - МетодИнтеграции, "НастройкаИнтеграции, ТочкаВхода"); - СтруктураНастроек = ПолучитьСтруктуруНастроекИнтеграции(СтруктураМетодаИНастроек.НастройкаИнтеграции); - пбп_ОбщегоНазначенияСлужебныйКлиентСервер.ДополнитьСтруктуру(СтруктураМетодаИНастроек, СтруктураНастроек); - - Возврат СтруктураМетодаИНастроек; - -КонецФункции - // Функция возвращает строку, закодированную в base64. // // Параметры: @@ -190,6 +65,14 @@ КонецФункции +// Получает дату из UnixTime +// +// Параметры: +// Секунд - Число - значение секунд в UnixTime +// +// Возвращаемое значение: +// Строка - строковое представление даты, полученное из UnixTime +// Функция ДатаИзUnixTime(Знач Секунд) Экспорт Если Не ЗначениеЗаполнено(Секунд) Тогда @@ -204,56 +87,31 @@ КонецФункции -// Получает структуру параметров интеграционного потока со значениями по умолчанию +// Получить подробное представление ошибки исключения // // Параметры: -// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - ссылка на метод, параметры которого получаем. -// ЗаполнятьПоУмолчанию - Булево - добавлять ли в возвращаемую структуру значения по умолчанию -// - Ложь - возвращает структуру вида ИмяПараметра<Строка>:ТипЗначения<ПеречислениеСсылка.пбп_ТипыJSON> -// - Истина - возвращает структуру вида ИмяПараметра<Строка>:ЗначениеПоУмолчанию<Строка> -// +// ЗаголовокОшибки - Строка - заголовок ошибки +// ИнформацияОбОшибке - ИнформацияОбОшибке - информация об ошибке, полученная в исключении +// // Возвращаемое значение: -// Структура +// Строка - полное описание ошибки // -Функция ПолучитьСтруктуруПараметровВхода(ИнтеграционныйПоток, ЗаполнятьПоУмолчанию = Ложь) Экспорт - - Возврат Справочники.пбп_ИнтеграционныеПотоки.ПолучитьСтруктуруПараметровВхода( - ИнтеграционныйПоток, ЗаполнятьПоУмолчанию); - +Функция ПолучитьПодробноеПредставлениеОшибкиИсключения(ЗаголовокОшибки, ИнформацияОбОшибке) Экспорт + + ПодробноеПредставление = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + ПодробноеПредставление = СтрЗаменить(ПодробноеПредставление, "'", ""); + + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, ПодробноеПредставление); + + Возврат НСтр(ПолноеОписаниеОшибки); + КонецФункции -// Получает предопределенный метод интеграции по идентификатору настройки -// -// Параметры: -// *ИдентификаторНастройки - Строка - строковый идентификатор предопределенного значения, реквизит ИдентификаторНастройки -// Возвращаемое значение: -// СправочникСсылка.пбп_МетодыИнтеграции - искомый метод интеграции -// -Функция МетодИнтеграции(ИдентификаторНастройки) Экспорт - Возврат Справочники.пбп_ИнтеграционныеПотоки.НайтиПоРеквизиту("ИдентификаторНастройки", ИдентификаторНастройки); -КонецФункции +#КонецОбласти // ОбщегоНазначения -// Получает предопределенную интегрируемую систему по идентификатору настройки -// -// Параметры: -// *ИдентификаторНастройки - Строка - строковый идентификатор предопределенного значения, реквизит ИдентификаторНастройки -// Возвращаемое значение: -// СправочникСсылка.пбп_ИнтегрируемыеСистемы - искомая система интеграции -// -Функция ИнтегрируемаяСистема(ИдентификаторНастройки) Экспорт - Возврат Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту("ИдентификаторНастройки", ИдентификаторНастройки); -КонецФункции +#Область МетодыИнтеграцийПоТипам -// Получает предопределенную настройку интеграции по идентификатору настройки -// -// Параметры: -// *ИдентификаторНастройки - Строка - строковый идентификатор предопределенного значения, реквизит ИдентификаторНастройки -// Возвращаемое значение: -// СправочникСсылка.пбп_НастройкиИнтеграции - искомая настройка интеграции -// -Функция НастройкаИнтеграции(ИдентификаторНастройки) Экспорт - Возврат Справочники.пбп_НастройкиИнтеграции.НайтиПоРеквизиту("ИдентификаторНастройки", ИдентификаторНастройки); -КонецФункции +#Область ПрямоеПодключениеКБД // Установить соединение с внешнем источником данных по настройке интеграции // @@ -262,7 +120,7 @@ // Процедура УстановитьСоединениеСВнешнимИсточникомДанныхПоНастройкеИнтеграции(НастройкаИнтеграции) Экспорт - СтруктураНастроек = ПолучитьСтруктуруНастроекИнтеграции(НастройкаИнтеграции); + СтруктураНастроек = пбп_ИнтеграцииСлужебный.ПолучитьСтруктуруНастроекИнтеграции(НастройкаИнтеграции); ИмяВнешнегоИсточникаДанных = СтруктураНастроек.ИмяОбъекта; ПараметрыСоединения = ВнешниеИсточникиДанных[ИмяВнешнегоИсточникаДанных].ПолучитьОбщиеПараметрыСоединения(); @@ -294,8 +152,18 @@ КонецПроцедуры +#КонецОбласти // ПрямоеПодключениеКБД + #Область REST +// Конвертирует тело HTTP-запроса из соответствия в строку +// +// Параметры: +// ТелоЗапросаJSON - Структура, Соответствие - данные тела запроса +// +// Возвращаемое значение: +// Строка - тело HTTP-запроса +// Функция ПолучитьЗапросТекстомИзСоответствияJSON(ТелоЗапросаJSON) Экспорт НастройкиСериализации = Новый НастройкиСериализацииJSON; @@ -311,6 +179,11 @@ КонецФункции +// Возвращает таблицу кодов ответа HTTP +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица с данными соответствия кода значений HTTP и его описанием +// Функция ПодготовитьТаблицуКодовОтветаHTTP() Экспорт ТаблицаКодовОтвета = Новый ТаблицаЗначений; @@ -473,239 +346,41 @@ #КонецОбласти // REST -#Область FTPSFTP - -// Параметры сообщения FTP / SFTP -// -// Возвращаемое значение: -// Структура - содержит ключи для описания сообщения обмена: -// * Путь - путь к файлу временного хранилища на сервере -// * ИмяФайла - имя файла без расширения -// * Расширение - расширение (файла без точки) -// * ДвоичныеДанные - данные файла. Если ключ "Путь" не заполнен, то его значение будет заполнено -// путем к временному файлу, сохраненного из этих двоичных данных -// -Функция ПараметрыСообщенияFTPSFTP() Экспорт - - Результат = Новый Структура("Путь, ИмяФайла, Расширение, ДвоичныеДанные"); - Возврат Результат; - -КонецФункции - -// Получить структуру параметров подключения к серверу FTP / SFTP -// -// Параметры: -// НастройкаИнтеграции - СправочникСсылка.пбп_НастройкиИнтеграции - настройка интеграции, -// для которой необходимо получить параметры -// -// Возвращаемое значение: -// Структура - Параметры соединения с сервером из настроек интеграции и безопасного хранилища -// -Функция ПолучитьПараметрыПодключенияFTPSFTP(НастройкаИнтеграции) Экспорт - - СтруктураНастроек = ПолучитьСтруктуруНастроекИнтеграции(НастройкаИнтеграции); - - ПараметрыСоединения = ПараметрыСоединенияFTPSFTP(); - ПараметрыСоединения.Адрес = СтруктураНастроек.СтрокаПодключения; - ПараметрыСоединения.Порт = Число(СтруктураНастроек.Порт); - - Если СтруктураНастроек.Свойство("Логин") Тогда - ПараметрыСоединения.ИмяПользователя = СтруктураНастроек.Логин.Значение; - Иначе - ПараметрыСоединения.ИмяПользователя = ""; - КонецЕсли; - - Если СтруктураНастроек.Свойство("Пароль") Тогда - ПараметрыСоединения.Пароль = СтруктураНастроек.Пароль.Значение; - Иначе - ПараметрыСоединения.Пароль = ""; - КонецЕсли; - - Возврат ПараметрыСоединения; - -КонецФункции - #Область FTP // Выполнить подключение к FTP-серверу по настройке интеграции -// -// Параметры: -// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, -// для которого выполняется подключение к FTP-серверу -// -// Возвращаемое значение: -// FTPСоединение, Строка - возвращает FTP-соединение по указанным настройкам, либо строку с описанием ошибки +// См. пбп_ИнтеграцииFTPSFTP.ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока. // Функция ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока(ИнтеграционныйПоток) Экспорт - СтруктураРеквизитов = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( - ИнтеграционныйПоток, "НастройкаИнтеграции, ТочкаВхода"); - - ПараметрыСоединения = ПолучитьПараметрыПодключенияFTPSFTP(СтруктураРеквизитов.НастройкаИнтеграции); - - Порт = ?(Не ЗначениеЗаполнено(ПараметрыСоединения.Порт), 21, ПараметрыСоединения.Порт); - - Таймаут = 0; - - Попытка - FTPСоединение = Новый FTPСоединение(ПараметрыСоединения.Адрес, - Порт, ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, , , Таймаут); - Исключение - ЗаголовокОшибки = "Не удалось установить соединение с FTP-сервером. Подробно: "; - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", - ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - - Возврат СообщениеОбОшибке; - КонецПопытки; - - КаталогИсходящие = СтруктураРеквизитов.ТочкаВхода; - КаталогИсходящие = СокрЛП(КаталогИсходящие); - Если Лев(КаталогИсходящие, 1) <> "/" Тогда - КаталогИсходящие = "/" + КаталогИсходящие; - КонецЕсли; - - Если FTPСоединение.ТекущийКаталог() <> КаталогИсходящие Тогда - Попытка - FTPСоединение.УстановитьТекущийКаталог(КаталогИсходящие); - Исключение - ЗаголовокОшибки = "Не удалось установить каталог для исходящих на FTP-сервере. Подробно: "; - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", - ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - - Возврат СообщениеОбОшибке; - КонецПопытки; - КонецЕсли; - - Возврат FTPСоединение; + Возврат пбп_ИнтеграцииFTPSFTP.ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока(ИнтеграционныйПоток); КонецФункции // Отправить сообщение FTP -// -// Параметры: -// ПодключениеКFTP - FTPСоединение- текущее соединение с FTP-сервером -// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) -// -// Возвращаемое значение: -// Строка - описание ошибки +// См. пбп_ИнтеграцииFTPSFTP.ОтправитьСообщениеFTP. // Функция ОтправитьСообщениеFTP(ПодключениеКFTP, ПараметрыСообщения) Экспорт - ЗаголовокОшибки = "Файл не был создан. Подробно: "; - СообщениеОбОшибке = ""; - - Попытка - ИмяФайлаСРасширением = СтрШаблон("%1.%2", ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); - - Если ПустаяСтрока(ПараметрыСообщения.Путь) Тогда - // BSLLS:MissingTemporaryFileDeletion-off - // Необходимо пропустить проверку, так как файл удаляется позже - НовыйФайл = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); - // BSLLS:MissingTemporaryFileDeletion-on - ПараметрыСообщения.Данные.Записать(НовыйФайл); - ПараметрыСообщения.Путь = НовыйФайл; - КонецЕсли; - - ПодключениеКFTP.Записать(ПараметрыСообщения.Путь, ИмяФайлаСРасширением); - - // Повторно проверяем наличие записанного файла - КаталогИсходящие = ПодключениеКFTP.ТекущийКаталог(); - - Если Не ПроверитьФайлЕстьНаFTP(ПодключениеКFTP, ИмяФайлаСРасширением, КаталогИсходящие) Тогда - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", - ЗаголовокОшибки, "подробности уточните у администратора системы"); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - КонецЕсли; - - пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(НовыйФайл); - Исключение - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", - ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - КонецПопытки; - - Возврат СообщениеОбОшибке; + Возврат пбп_ИнтеграцииFTPSFTP.ОтправитьСообщениеFTP(ПодключениеКFTP, ПараметрыСообщения); КонецФункции // Прочитать сообщение FTP -// -// Параметры: -// ПодключениеКFTP - FTPСоединение- текущее соединение с FTP-сервером -// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) -// -// Возвращаемое значение: -// Строка - описание ошибки +// См. пбп_ИнтеграцииFTPSFTP.ПрочитатьСообщениеFTP. // Функция ПрочитатьСообщениеFTP(ПодключениеКFTP, ПараметрыСообщения) Экспорт - ЗаголовокОшибки = "Файл не был получен. Подробно: "; - СообщениеОбОшибке = ""; - - Попытка - ИмяФайлаСРасширением = СтрШаблон("%1.%2", ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); - - // Проверяем наличие получаемого файла - КаталогВходящие = ПодключениеКFTP.ТекущийКаталог(); - - Если Не ПроверитьФайлЕстьНаFTP(ПодключениеКFTP, ИмяФайлаСРасширением, КаталогВходящие) Тогда - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", - ЗаголовокОшибки, "искомый файл отсутствует на FTP-сервере"); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - Возврат СообщениеОбОшибке; - КонецЕсли; - - Если ПустаяСтрока(ПараметрыСообщения.Путь) Тогда - // BSLLS:MissingTemporaryFileDeletion-off - // Необходимо пропустить проверку, так как полученный файл должен храниться до его обработки - ПараметрыСообщения.Путь = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); - // BSLLS:MissingTemporaryFileDeletion-on - КонецЕсли; - - ПодключениеКFTP.Получить(ИмяФайлаСРасширением, ПараметрыСообщения.Путь); - Исключение - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", - ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - КонецПопытки; - - Возврат СообщениеОбОшибке; + Возврат пбп_ИнтеграцииFTPSFTP.ПрочитатьСообщениеFTP(ПодключениеКFTP, ПараметрыСообщения); КонецФункции // Проверяет наличие файла на FTP -// -// Параметры: -// FTPСоединение - FTPСоединение - текущее соединение с FTP-сервером -// ИмяФайла - Строка - имя искомого файла -// КаталогПоиска - Строка - каталог поиска файла на FTP-сервере -// ПоТочномуСовпадению - Булево - если Истина, то поиск на равенство, если Ложь - по вхождению -// -// Возвращаемое значение: -// Булево - файл найден +// См. пбп_ИнтеграцииFTPSFTP.ПроверитьФайлЕстьНаFTP. // Функция ПроверитьФайлЕстьНаFTP(FTPСоединение, ИмяФайла, КаталогПоиска = "/", ПоТочномуСовпадению = Истина) Экспорт - Результат = Ложь; - - ФайлыНаРесурсе = FTPСоединение.НайтиФайлы(КаталогПоиска); - Для Каждого ФайлНаСервере Из ФайлыНаРесурсе Цикл - Если ПоТочномуСовпадению Тогда - Если ВРег(ФайлНаСервере) = ВРег(ИмяФайла) Тогда - Результат = Истина; - Прервать; - КонецЕсли; - Иначе - Если СтрНайти(ВРег(ФайлНаСервере), ВРег(ИмяФайла), НаправлениеПоиска.СНачала) > 0 Тогда - Результат = Истина; - Прервать; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат Результат; + Возврат пбп_ИнтеграцииFTPSFTP.ПроверитьФайлЕстьНаFTP(FTPСоединение, ИмяФайла, КаталогПоиска, ПоТочномуСовпадению); КонецФункции @@ -714,181 +389,61 @@ #Область SFTP // Отправляет сообщение на SFTP-сервер. -// Для отправки на ОС Linux используется одна из установленных утилит: -// 1) curl; -// 2) sshpass; -// 4) expect. -// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). -// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. -// -// Для отправки на ОС Windows используется WinSCP. -// -// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка. +// См. пбп_ИнтеграцииFTPSFTP.ОтправитьСообщениеSFTP. // -// Параметры: -// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, -// для которого выполняется подключение к FTP-серверу -// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) -// -// Возвращаемое значение: -// Строка - описание ошибки -// -Функция ОтправитьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения) Экспорт +Функция ОтправитьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории = Неопределено) Экспорт - ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток); + Возврат пбп_ИнтеграцииFTPSFTP.ОтправитьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории); - Если ПустаяСтрока(ПараметрыСообщения.Путь) Тогда - // BSLLS:MissingTemporaryFileDeletion-off - // Необходимо пропустить проверку, так как файл удаляется позже - НовыйФайл = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); - // BSLLS:MissingTemporaryFileDeletion-on - ПараметрыСообщения.Данные.Записать(НовыйФайл); - ПараметрыСообщения.Путь = НовыйФайл; - КонецЕсли; - - СообщениеОбОшибке = ОпределитьТипОтправкиИОтправитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения); +КонецФункции + +// Получает список файлов с каталога SFTP-сервера. +// См. пбп_ИнтеграцииFTPSFTP.ПолучитьСодержимоеКаталогаSFTP. +// +Функция ПолучитьСодержимоеКаталогаSFTP(ИнтеграционныйПоток, КаталогПоиска, СтруктураИстории = Неопределено) Экспорт - Возврат СообщениеОбОшибке; + Возврат пбп_ИнтеграцииFTPSFTP.ПолучитьСодержимоеКаталогаSFTP(ИнтеграционныйПоток, КаталогПоиска, СтруктураИстории); КонецФункции // Проверяет наличие файла на SFTP -// -// Параметры: -// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, -// для которого выполняется подключение к FTP-серверу -// ИмяФайла - Строка - имя искомого файла -// КаталогПоиска - Строка - каталог поиска файла на FTP-сервере -// ПоТочномуСовпадению - Булево - если Истина, то поиск на равенство, если Ложь - по вхождению -// -// Возвращаемое значение: -// Булево - файл найден +// См. пбп_ИнтеграцииFTPSFTP.ПроверитьФайлЕстьНаSFTP. // Функция ПроверитьФайлЕстьНаSFTP(ИнтеграционныйПоток, - ИмяФайла, КаталогПоиска = "/", ПоТочномуСовпадению = Истина) Экспорт - - ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, Ложь); - ПараметрыСоединения.КаталогИсходящие = КаталогПоиска; - - Результат = Ложь; + ИмяФайла, КаталогПоиска = "/", ПоТочномуСовпадению = Истина, СтруктураИстории = Неопределено) Экспорт - ФайлыНаРесурсе = ОпределитьТипЧтенияИПрочитатьСодержимоеНаSFTP(ПараметрыСоединения); - Если ТипЗнч(ФайлыНаРесурсе) = Тип("Строка") Тогда - Возврат ФайлыНаРесурсе; - КонецЕсли; - - Для Каждого ФайлНаСервере Из ФайлыНаРесурсе Цикл - Если ПоТочномуСовпадению Тогда - Если ВРег(ФайлНаСервере) = ВРег(ИмяФайла) Тогда - Результат = Истина; - Прервать; - КонецЕсли; - Иначе - Если СтрНайти(ВРег(ФайлНаСервере), ВРег(ИмяФайла), НаправлениеПоиска.СНачала) > 0 Тогда - Результат = Истина; - Прервать; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Возврат Результат; + Возврат пбп_ИнтеграцииFTPSFTP.ПроверитьФайлЕстьНаSFTP(ИмяФайла, + КаталогПоиска, ПоТочномуСовпадению, СтруктураИстории); КонецФункции // Получает сообщение с SFTP-сервера. -// Путь к полученному файлу будет лежать в ключе "Путь" структуры ПараметрыСообщения. -// -// Для получения файлов на ОС Linux используется одна из установленных утилит: -// 1) curl; -// 2) sshpass; -// 4) expect. -// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). -// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. -// -// Для получения на ОС Windows используется WinSCP. +// См. пбп_ИнтеграцииFTPSFTP.ПрочитатьСообщениеSFTP. // -// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка. -// -// Параметры: -// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, -// для которого выполняется подключение к FTP-серверу -// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) -// -// Возвращаемое значение: -// Строка - описание ошибки -// -Функция ПрочитатьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения) Экспорт +Функция ПрочитатьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории = Неопределено) Экспорт - ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток); + Возврат пбп_ИнтеграцииFTPSFTP.ПрочитатьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории); - СообщениеОбОшибке = ОпределитьТипПолученияИПолучитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения); +КонецФункции + +// Удаляет файл с SFTP-сервера. +// См. пбп_ИнтеграцииFTPSFTP.УдалитьФайлSFTP. +// +Функция УдалитьФайлSFTP(ИнтеграционныйПоток, ИмяФайла, + КаталогФайла = "/", ПроверитьНаличиеПередУдалением = Истина, СтруктураИстории = Неопределено) Экспорт - Возврат СообщениеОбОшибке; + Возврат пбп_ИнтеграцииFTPSFTP.УдалитьФайлSFTP(ИнтеграционныйПоток, + ИмяФайла, КаталогФайла, ПроверитьНаличиеПередУдалением, СтруктураИстории); КонецФункции #КонецОбласти // SFTP -#КонецОбласти // FTPSFTP - #КонецОбласти -#Область СлужебныеПроцедурыИФункции +#КонецОбласти // ПрограммныйИнтерфейс -// Процедура обрабатывает запросы в структуре записи истории -Процедура ДополнительноОбработатьЗапросыИнтеграцииПередЗаписьюВИсторию(СтруктураЗаписиИстории) - - Если НЕ ПустаяСтрока(СтруктураЗаписиИстории.ИсходящееСообщение) - И СтрНайти(СтруктураЗаписиИстории.ИсходящееСообщение, "xml") <> 0 Тогда - - ОчиститьДлинныеАтрибутыСообщенияXML(СтруктураЗаписиИстории.ИсходящееСообщение); - - КонецЕсли; - - Если НЕ ПустаяСтрока(СтруктураЗаписиИстории.ВходящееСообщение) - И СтрНайти(СтруктураЗаписиИстории.ВходящееСообщение, "xml") <> 0 Тогда - - ОчиститьДлинныеАтрибутыСообщенияXML(СтруктураЗаписиИстории.ВходящееСообщение); - - КонецЕсли; - -КонецПроцедуры - -// Процедура очищает XML строку от длинных записей (например base64 строк) -Процедура ОчиститьДлинныеАтрибутыСообщенияXML(XMLСтрока) - - ЧтениеXML = Новый ЧтениеXML; - ЧтениеXML.УстановитьСтроку(XMLСтрока); - - ПостроительDOM = Новый ПостроительDOM; - ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); - - ТребуетсяПерезаписатьXML = Ложь; - - //Перебрать все узлы - ИтераторДерева = Новый ОбходДереваDOM(ДокументDOM); - Пока ИтераторДерева.СледующийУзел() <> Неопределено Цикл - Если ТипЗнч(ИтераторДерева.ТекущийУзел) = Тип("ЭлементDOM") Тогда - Если СтрДлина(ИтераторДерева.ТекущийУзел.ТекстовоеСодержимое) > 1000 Тогда - ИтераторДерева.ТекущийУзел.ТекстовоеСодержимое = "X"; - ТребуетсяПерезаписатьXML = Истина; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Если ТребуетсяПерезаписатьXML Тогда - - ЗаписьXML = Новый ЗаписьXML; - ЗаписьXML.УстановитьСтроку(Новый ПараметрыЗаписиXML(, , Истина, Истина)); - - ЗаписьDOM = Новый ЗаписьDOM; - ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML); - - XMLСтрока = ЗаписьXML.Закрыть(); - - КонецЕсли; - -КонецПроцедуры +#Область СлужебныеПроцедурыИФункции // Получить имя СУБД внешнего источника данных по строке соединения // @@ -918,671 +473,4 @@ КонецФункции -#Область FTPSFTP - -Функция ПараметрыСоединенияFTPSFTP() - - Результат = Новый Структура("Адрес, Порт, Логин, Пароль, КаталогВходящие, КаталогИсходящие"); - Возврат Результат; - -КонецФункции - -Функция ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, - ЗаполнитьКаталог = Истина, ИсходящееСообщение = Истина) - - СтруктураРеквизитов = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( - ИнтеграционныйПоток, "НастройкаИнтеграции, ТочкаВхода"); - - ПараметрыСоединения = ПолучитьПараметрыПодключенияFTPSFTP(СтруктураРеквизитов.НастройкаИнтеграции); - - Если ЗаполнитьКаталог Тогда - Каталог = СокрЛП(СтруктураРеквизитов.ТочкаВхода); - Если Лев(Каталог, 1) <> "/" Тогда - Каталог = "/" + Каталог; - КонецЕсли; - - Если Прав(Каталог, 1) <> "/" Тогда - Каталог = Каталог + "/"; - КонецЕсли; - - Если ИсходящееСообщение Тогда - ПараметрыСоединения.КаталогИсходящие = Каталог; - Иначе - ПараметрыСоединения.КаталогВходящие = Каталог; - КонецЕсли; - КонецЕсли; - - Возврат ПараметрыСоединения; - -КонецФункции - -#Область SFTP - -Функция ОпределитьТипОтправкиИОтправитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения) - - ЗаголовокОшибки = "Файл не был отправлен на SFTP-сервер"; - СообщениеОбОшибке = ""; - - ПутьФайлаНаСервере = СтрШаблон("%1%2.%3", ПараметрыСоединения.КаталогИсходящие, - ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); - - ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); - - ТекстСкрипта = ПолучитьТекстСкриптаОтправкиПоТипуОС(ЭтоLinuxСервер, - ПараметрыСоединения, ПараметрыСообщения.Путь, ПутьФайлаНаСервере); - Если ПустаяСтрока(ТекстСкрипта) Тогда - Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); - КонецЕсли; - - ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); - Если ЭтоLinuxСервер Тогда - РасширениеФайлаСкрипта = "sh"; - Иначе - РасширениеФайлаСкрипта = "bat"; - КонецЕсли; - // BSLLS:MissingTemporaryFileDeletion-off - ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); - // BSLLS:MissingTemporaryFileDeletion-on - ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); - - СообщениеОбОшибке = ВыполнитьКомандуСистемыПриПолученииИлиОтправке( - ЭтоLinuxСервер, ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки); - - Возврат СообщениеОбОшибке; - -КонецФункции - -Функция ОпределитьТипЧтенияИПрочитатьСодержимоеНаSFTP(ПараметрыСоединения) - - ЗаголовокОшибки = "Не удалось получить содержимое папки SFTP-сервера"; - СообщениеОбОшибке = ""; - - // BSLLS:MissingTemporaryFileDeletion-off - ПутьКФайлуСодержимого = ПолучитьИмяВременногоФайла("txt"); - // BSLLS:MissingTemporaryFileDeletion-on - - ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); - - ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговПоТипуОС( - ЭтоLinuxСервер, ПараметрыСоединения, ПутьКФайлуСодержимого); - Если ПустаяСтрока(ТекстСкрипта) Тогда - Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); - КонецЕсли; - - ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); - Если ЭтоLinuxСервер Тогда - РасширениеФайлаСкрипта = "sh"; - Иначе - РасширениеФайлаСкрипта = "bat"; - КонецЕсли; - // BSLLS:MissingTemporaryFileDeletion-off - ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); - // BSLLS:MissingTemporaryFileDeletion-on - ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); - - ИмяСлужебногоФайла = ""; - - Попытка - КодВозврата = 0; - Если ЭтоLinuxСервер Тогда - ЭтоExpect = СтрНайти(ТекстСкрипта, "expect") > 0; - Если ЭтоExpect Тогда - ВспомогательныйСкрипт = СтрШаблон("#!/bin/bash - | - |expect %1 > %2", ИмяФайлаСкрипта, ПутьКФайлуСодержимого); - - ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ВспомогательныйСкрипт); - // BSLLS:MissingTemporaryFileDeletion-off - ИмяСлужебногоФайла = ПолучитьИмяВременногоФайла("sh"); - // BSLLS:MissingTemporaryFileDeletion-on - ДвоичныеДанныеСкрипта.Записать(ИмяСлужебногоФайла); - - ИтоговаяКоманда = "sh """ + ИмяСлужебногоФайла + """"; - Иначе - ИтоговаяКоманда = "sh """ + ИмяФайлаСкрипта + """"; - КонецЕсли; - Иначе - ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; - КонецЕсли; - - ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); - ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; - - // BSLLS:ExternalAppStarting-off - Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); - // BSLLS:ExternalAppStarting-on - - пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяФайлаСкрипта); - - Если Не ПустаяСтрока(ИмяСлужебногоФайла) Тогда - пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяСлужебногоФайла); - КонецЕсли; - - УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта, ИмяСлужебногоФайла); - - Если Результат.КодВозврата <> 0 Тогда - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, - "не удалось выполнить команду системы, код возврата", КодВозврата); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - - Возврат СообщениеОбОшибке; - КонецЕсли; - - МассивФайлов = ПолучитьМассивФайловСодержимогоSFTPСервера(ПутьКФайлуСодержимого); - - пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ПутьКФайлуСодержимого); - - Возврат МассивФайлов; - Исключение - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, - ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - - УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта, ИмяСлужебногоФайла); - КонецПопытки; - - Возврат СообщениеОбОшибке; - -КонецФункции - -Функция ОпределитьТипПолученияИПолучитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения) - - ЗаголовокОшибки = "Файл не был получен с SFTP-сервера"; - СообщениеОбОшибке = ""; - - ПутьФайлаНаСервере = СтрШаблон("%1%2.%3", ПараметрыСоединения.КаталогВходящие, - ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); - // BSLLS:MissingTemporaryFileDeletion-off - // Файл не должен удаляться, так как после получения с SFTP-сервера передается в обработку - ПараметрыСообщения.Путь = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); - // BSLLS:MissingTemporaryFileDeletion-on - - ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); - - ТекстСкрипта = ПолучитьТекстСкриптаПолученияПоТипуОС(ЭтоLinuxСервер, - ПараметрыСоединения, ПараметрыСообщения.Путь, ПутьФайлаНаСервере); - Если ПустаяСтрока(ТекстСкрипта) Тогда - Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); - КонецЕсли; - - ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); - Если ЭтоLinuxСервер Тогда - РасширениеФайлаСкрипта = "sh"; - Иначе - РасширениеФайлаСкрипта = "bat"; - КонецЕсли; - // BSLLS:MissingTemporaryFileDeletion-off - ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); - // BSLLS:MissingTemporaryFileDeletion-on - ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); - - СообщениеОбОшибке = ВыполнитьКомандуСистемыПриПолученииИлиОтправке( - ЭтоLinuxСервер, ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки); - - Возврат СообщениеОбОшибке; - -КонецФункции - -Процедура УдалитьВременныеФайлыСкриптов(ИмяОсновногоФайла, Знач ИмяВторогоФайла = "") - - пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяОсновногоФайла); - - Если Не ПустаяСтрока(ИмяВторогоФайла) Тогда - пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяВторогоФайла); - КонецЕсли; - -КонецПроцедуры - -Функция ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер) - - Если ЭтоLinuxСервер Тогда - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, - "Не найдено ни одной установленной утилиты подключения к SFTP (curl, sshpass, expect)"); - Иначе - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, - "Не найдено утилиты подключения к SFTP - WinSCP"); - КонецЕсли; - - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - - Возврат СообщениеОбОшибке; - -КонецФункции - -Функция ПолучитьТекстСкриптаОтправкиПоТипуОС(ЭтоLinuxСервер, - ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере) - - Если ЭтоLinuxСервер Тогда - ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); - - Если ИмяУтилиты = "curl" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаОтправкиCURL( - ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); - ИначеЕсли ИмяУтилиты = "sshpass" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаОтправкиSSHPASS( - ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); - ИначеЕсли ИмяУтилиты = "expect" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаОтправкиEXPECT( - ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); - Иначе - ТекстСкрипта = ""; - КонецЕсли; - Иначе - УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); - - Если УтилитаУстановлена Тогда - ТекстСкрипта = ПолучитьТекстСкриптаОтправкиДляWinSCP(ПараметрыСоединения); - Иначе - ТекстСкрипта = ""; - КонецЕсли; - КонецЕсли; - - Возврат ТекстСкрипта; - -КонецФункции - -Функция ПолучитьТекстСкриптаСодержимогоКаталоговПоТипуОС(ЭтоLinuxСервер, - ПараметрыСоединения, ПутьЛокальногоФайла) - - Если ЭтоLinuxСервер Тогда - ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); - - Если ИмяУтилиты = "curl" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговCURL( - ПараметрыСоединения, ПутьЛокальногоФайла); - ИначеЕсли ИмяУтилиты = "sshpass" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговSSHPASS( - ПараметрыСоединения, ПутьЛокальногоФайла); - ИначеЕсли ИмяУтилиты = "expect" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговEXPECT( - ПараметрыСоединения, ПутьЛокальногоФайла); - Иначе - ТекстСкрипта = ""; - КонецЕсли; - Иначе - УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); - - Если УтилитаУстановлена Тогда - ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговДляWinSCP(ПараметрыСоединения); - Иначе - ТекстСкрипта = ""; - КонецЕсли; - КонецЕсли; - - Возврат ТекстСкрипта; - -КонецФункции - -Функция ПолучитьТекстСкриптаПолученияПоТипуОС(ЭтоLinuxСервер, - ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере) - - Если ЭтоLinuxСервер Тогда - ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); - - Если ИмяУтилиты = "curl" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаПолученияCURL( - ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); - ИначеЕсли ИмяУтилиты = "sshpass" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаПолученияSSHPASS( - ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); - ИначеЕсли ИмяУтилиты = "expect" Тогда - ТекстСкрипта = ПолучитьТекстСкриптаПолученияEXPECT( - ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); - Иначе - ТекстСкрипта = ""; - КонецЕсли; - Иначе - УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); - - Если УтилитаУстановлена Тогда - ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляWinSCP(ПараметрыСоединения); - Иначе - ТекстСкрипта = ""; - КонецЕсли; - КонецЕсли; - - Возврат ТекстСкрипта; - -КонецФункции - -Функция ПолучитьМассивФайловСодержимогоSFTPСервера(ПутьКФайлуСодержимого) - - МассивФайлов = Новый Массив; - - ЧтениеФайла = Новый ЧтениеТекста(ПутьКФайлуСодержимого); - ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); - НужноеКоличество = 2; - Пока ТекущаяСтрока <> Неопределено Цикл - Если Лев(ТекущаяСтрока, 1) = "-" Тогда - ЗаполнитьИмяФайлаВМассивИзСтрокиСпискаФайлов(МассивФайлов, ТекущаяСтрока, НужноеКоличество); - КонецЕсли; - - ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); - КонецЦикла; - - Возврат МассивФайлов; - -КонецФункции - -Процедура ЗаполнитьИмяФайлаВМассивИзСтрокиСпискаФайлов(МассивФайлов, ТекущаяСтрока, НужноеКоличество) - - // Разделяем по времени создания - МассивВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекущаяСтрока, ":"); - Если МассивВремя.Количество() = НужноеКоличество Тогда - МинутыИИмяФайла = МассивВремя[1]; - - // Время разделено от имени пробелом, но в самом имени файла тоже могут быть пробелы - МассивИмяФайла = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(МинутыИИмяФайла, " "); - - ИмяТекущегоФайла = ""; - Для Инкремент = 0 По МассивИмяФайла.Количество() - 1 Цикл - Если Инкремент = 0 Тогда - Продолжить; - КонецЕсли; - - ИмяТекущегоФайла = ИмяТекущегоФайла + МассивИмяФайла[Инкремент]; - КонецЦикла; - - МассивФайлов.Добавить(ИмяТекущегоФайла); - КонецЕсли; - -КонецПроцедуры - -Функция ВыполнитьКомандуСистемыПриПолученииИлиОтправке(ЭтоLinuxСервер, ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки) - - Попытка - КодВозврата = 0; - Если ЭтоLinuxСервер Тогда - Если СтрНайти(ТекстСкрипта, "expect") > 0 Тогда - ИтоговаяКоманда = "expect """ + ИмяФайлаСкрипта + """"; - Иначе - ИтоговаяКоманда = "sh """ + ИмяФайлаСкрипта + """"; - КонецЕсли; - Иначе - ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; - КонецЕсли; - - ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); - ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; - - // BSLLS:ExternalAppStarting-off - Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); - // BSLLS:ExternalAppStarting-on - - УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта); - - Если Результат.КодВозврата <> 0 Тогда - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, - "не удалось выполнить команду системы, код возврата", КодВозврата); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - КонецЕсли; - Исключение - ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, - ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); - - УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта); - КонецПопытки; - - Возврат СообщениеОбОшибке; - -КонецФункции - -#Область SFTPWindows - -Функция ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows() - - Возврат Ложь; - -КонецФункции - -Функция ПолучитьТекстСкриптаОтправкиДляWinSCP(ПараметрыСоединения) - - Возврат ""; - -КонецФункции - -Функция ПолучитьТекстСкриптаСодержимогоКаталоговДляWinSCP(ПараметрыСоединения) - - Возврат ""; - -КонецФункции - -Функция ПолучитьТекстСкриптаПолученияДляWinSCP(ПараметрыСоединения) - - Возврат ""; - -КонецФункции - -#КонецОбласти // SFTPWindows - -#Область SFTPLinux - -Функция ПолучитьИмяУтилитыПодключенияКSFTPLinux() - - ИмяУстановленнойУтилиты = ""; - - МассивИменУтилит = Новый Массив; - МассивИменУтилит.Добавить("curl"); - МассивИменУтилит.Добавить("sshpass"); - МассивИменУтилит.Добавить("expect"); - - Для Каждого ИмяУтилиты Из МассивИменУтилит Цикл - Если ПроверитьСуществованиеУтилитыПодключенияКSFTPLinux(ИмяУтилиты) Тогда - ИмяУстановленнойУтилиты = ИмяУтилиты; - Прервать; - КонецЕсли; - КонецЦикла; - - Возврат ИмяУстановленнойУтилиты; - -КонецФункции - -Функция ПроверитьСуществованиеУтилитыПодключенияКSFTPLinux(ИмяУтилиты) - - РезультатПроверки = Ложь; - - // BSLLS:MissingTemporaryFileDeletion-off - ИмяФайлаПроверки = ПолучитьИмяВременногоФайла("txt"); - // BSLLS:MissingTemporaryFileDeletion-on - - КомандаПроверки = СтрШаблон("command -v %1 > %2", ИмяУтилиты, ИмяФайлаПроверки); - - ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); - ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; - - // BSLLS:ExternalAppStarting-off - Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(КомандаПроверки, ПараметрыЗапускаКоманды); - // BSLLS:ExternalAppStarting-on - - Если Результат.КодВозврата = 0 Тогда - ЧтениеФайла = Новый ЧтениеТекста(ИмяФайлаПроверки); - ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); - Если ТекущаяСтрока <> Неопределено Тогда - РезультатПроверки = Истина; - КонецЕсли; - КонецЕсли; - - УдалитьВременныеФайлыСкриптов(ИмяФайлаПроверки); - - Возврат РезультатПроверки; - -КонецФункции - -#Область CURL - -Функция ПолучитьТекстСкриптаОтправкиCURL(ПараметрыСоединения, ПутьОтправляемогоФайла, ПутьФайлаНаСервере) - - ТекстСкрипта = "#!/usr/bin/bash - | - |curl -k ""sftp://%1%2"" --user ""%3:%4"" -T %5"; - - ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПутьФайлаНаСервере, - ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьОтправляемогоФайла); - - Возврат ТекстСкрипта; - -КонецФункции - -Функция ПолучитьТекстСкриптаСодержимогоКаталоговCURL(ПараметрыСоединения, ПутьКФайлуСодержимогоКаталога) - - ТекстСкрипта = "#!/usr/bin/bash - | - |curl -k ""sftp://%1%2"" --user ""%3:%4"" > %5"; - - ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПараметрыСоединения.Каталог, - ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьКФайлуСодержимогоКаталога); - - Возврат ТекстСкрипта; - -КонецФункции - -Функция ПолучитьТекстСкриптаПолученияCURL(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) - - ТекстСкрипта = "#!/usr/bin/bash - | - |curl -k ""sftp://%1%2"" --user ""%3:%4"" -o %5"; - - ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПутьФайлаНаСервере, - ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьСохраняемогоФайла); - - Возврат ТекстСкрипта; - -КонецФункции - -#КонецОбласти // CURL - -#Область SSHPASS - -Функция ПолучитьТекстСкриптаОтправкиSSHPASS(ПараметрыСоединения, ПутьОтправляемогоФайла, ПутьФайлаНаСервере) - - ТекстСкрипта = "#!/usr/bin/bash - | - |HOST=""%1"" - |USERNAME=""%2"" - |PASSWORD=""%3"" - |PORT=%4 - | - |sshpass -p ""$PASSWORD"" sftp -oPort=$PORT $USERNAME@$HOST < %6"; - - ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПараметрыСоединения.Логин, - ПараметрыСоединения.Пароль, ПараметрыСоединения.Порт, ПараметрыСоединения.КаталогИсходящие, - ПутьКФайлуСодержимогоКаталога); - - Возврат ТекстСкрипта; - -КонецФункции - -Функция ПолучитьТекстСкриптаПолученияSSHPASS(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) - - ТекстСкрипта = "#!/usr/bin/bash - | - |HOST=""%1"" - |USERNAME=""%2"" - |PASSWORD=""%3"" - |PORT=%4 - | - |sshpass -p ""$PASSWORD"" sftp -oPort=$PORT $USERNAME@$HOST <"" - |send ""put %5 %6\n"" - |expect ""sftp>"" - |send ""exit\n"" - |interact"; - - ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, - ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПутьОтправляемогоФайла, ПутьФайлаНаСервере); - - Возврат ТекстСкрипта; - -КонецФункции - -Функция ПолучитьТекстСкриптаСодержимогоКаталоговEXPECT(ПараметрыСоединения, ПутьКФайлуСодержимогоКаталога) - - ТекстСкрипта = "#!/usr/bin/expect - | - |spawn sftp -P %1 %2@%3 - |expect ""%2@%3's password:"" - |send ""%4\n"" - |expect ""sftp>"" - |send ""ls -l %5\n"" - |expect ""sftp>"" - |send ""exit\n"" - |interact"; - - ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, - ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПараметрыСоединения.КаталогИсходящие); - - Возврат ТекстСкрипта; - -КонецФункции - -Функция ПолучитьТекстСкриптаПолученияEXPECT(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) - - ТекстСкрипта = "#!/usr/bin/expect - | - |spawn sftp -P %1 %2@%3 - |expect ""%2@%3's password:"" - |send ""%4\n"" - |expect ""sftp>"" - |send ""get %5 %6\n"" - |expect ""sftp>"" - |send ""exit\n"" - |interact"; - - ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, - ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПутьФайлаНаСервере, ПутьСохраняемогоФайла); - - Возврат ТекстСкрипта; - -КонецФункции - -#КонецОбласти // EXPECT - -#КонецОбласти // SFTPLinux - -#КонецОбласти // SFTP - -#КонецОбласти // FTPSFTP - #КонецОбласти // СлужебныеПроцедурыИФункции \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.xml" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.xml" new file mode 100644 index 00000000..bf527aa3 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.xml" @@ -0,0 +1,23 @@ + + + + + пбп_ИнтеграцииСлужебный + + + ru + Пбп интеграции служебный + + + + false + false + true + true + false + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" new file mode 100644 index 00000000..d3da2158 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" @@ -0,0 +1,289 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8, +// включая доработку типовых конфигураций. +// +// Copyright First BIT company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// URL: https://github.com/firstBitSportivnaya/PSSL/ +// + +#Область СлужебныйПрограммныйИнтерфейс + +#Область ИсторияИнтеграции + +// Функция возвращает структуру со всеми необходимыми значениями для заполнения записи истории интеграции +// +// Возвращаемое значение: +// Структура - описание свойств истории интеграции +// +Функция ПолучитьСтруктуруЗаписиИстории() Экспорт + + СтруктураЗаписиИстории = Новый Структура; + СтруктураЗаписиИстории.Вставить("ИнтеграционныйПоток", Неопределено); + СтруктураЗаписиИстории.Вставить("ВходящееСообщение", ""); + СтруктураЗаписиИстории.Вставить("ИсходящееСообщение", ""); + СтруктураЗаписиИстории.Вставить("ИнтегрируемаяСистема", Неопределено); + СтруктураЗаписиИстории.Вставить("ОписаниеОшибки", ""); + СтруктураЗаписиИстории.Вставить("ПротоколОбмена", ""); + СтруктураЗаписиИстории.Вставить("ДатаНачалаИнтеграции", ТекущаяДатаСеанса()); + СтруктураЗаписиИстории.Вставить("ДлительностьВызова", 0); + СтруктураЗаписиИстории.Вставить("ФорматИнтеграции", Перечисления.пбп_ФорматыИнтеграций.XML); + СтруктураЗаписиИстории.Вставить("ИмяФайлаСообщения", ""); + СтруктураЗаписиИстории.Вставить("ФайлСообщения", Неопределено); + ОбъектыИнтеграции = Новый ТаблицаЗначений; + ОбъектыИнтеграции.Колонки.Добавить("ОбъектИнтеграции"); + ОбъектыИнтеграции.Колонки.Добавить("СозданОбновлен"); + СтруктураЗаписиИстории.Вставить("ОбъектыИнтеграции", ОбъектыИнтеграции); + + Возврат СтруктураЗаписиИстории; + +КонецФункции + +// Процедура создает запись справочника История интеграции с информацией о событии интеграции +// +// Параметры: +// СтруктураЗаписиИстории - Структура - описание действия (см. ПолучитьСтруктуруЗаписиИстории) +// ЭтоЗагрузка - Булево - Истина если это Загрузка, Ложь если это Выгрузка +// +Процедура СоздатьСообщениеИсторииИнтеграции(СтруктураЗаписиИстории, ЭтоЗагрузка) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ДополнительноОбработатьЗапросыИнтеграцииПередЗаписьюВИсторию(СтруктураЗаписиИстории); + + НовоеСообщение = Справочники.пбп_ИсторияИнтеграции.СоздатьЭлемент(); + НовоеСообщение.ДатаИнтеграции = ТекущаяДатаСеанса(); + НовоеСообщение.ДатаИнтеграцииВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах(); + НовоеСообщение.Код = Новый УникальныйИдентификатор(); + НовоеСообщение.Ошибка = ЗначениеЗаполнено(СтруктураЗаписиИстории.ОписаниеОшибки); + НовоеСообщение.Пользователь = пбп_ПользователиСлужебный.ТекущийПользователь(); + НовоеСообщение.ДлительностьОбмена = НовоеСообщение.ДатаИнтеграции - СтруктураЗаписиИстории.ДатаНачалаИнтеграции; + НовоеСообщение.ДлительностьВызова = СтруктураЗаписиИстории.ДлительностьВызова; + Если ЭтоЗагрузка Тогда + Если НовоеСообщение.Ошибка Тогда + НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.ОшибкаЗагрузки; + Иначе + НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.Загружено; + КонецЕсли; + Иначе + Если НовоеСообщение.Ошибка Тогда + НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.ОшибкаВыгрузки; + Иначе + НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.Выгружено; + КонецЕсли; + КонецЕсли; + ЗаполнитьЗначенияСвойств(НовоеСообщение, СтруктураЗаписиИстории); + Для Каждого Строка Из СтруктураЗаписиИстории.ОбъектыИнтеграции Цикл + НоваяСтрока = НовоеСообщение.ОбъектыИнтеграции.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); + КонецЦикла; + + НовоеСообщение.Записать(); + +КонецПроцедуры + +// Процедура добавляет сообщения в протокол обмена через указанный разделитель +// +// Параметры: +// СтруктураОтвета - Структура - см. ИнтеграцииСервер.ПолучитьСтруктуруЗаписиИстории +// ТекстСообщения - Строка - Текст, который будет записан в протокол обмена +// Разделитель - Строка - Разделитель записей +Процедура ДобавитьЗаписьВПротоколОбмена(СтруктураОтвета, ТекстСообщения, Разделитель = "") Экспорт + + Если ПустаяСтрока(Разделитель) Тогда + Разделитель = ";" + Символы.ПС; + КонецЕсли; + + ВыводРазделителя = ?(ПустаяСтрока(СтруктураОтвета.ПротоколОбмена), "", Разделитель); + + СтруктураОтвета.ПротоколОбмена = СтруктураОтвета.ПротоколОбмена + ВыводРазделителя + НСтр(ТекстСообщения); + +КонецПроцедуры + +#КонецОбласти // ИсторияИнтеграции + +#Область РаботаСДанными + +// Возвращает структуру с настройками для интеграции +// +// Параметры: +// НастройкаИнтеграции - СправочникСсылка.пбп_НастройкиИнтеграции - Ссылка на элемент справочника Настройки интеграции +// +// Возвращаемое значение: +// Структура +Функция ПолучитьСтруктуруНастроекИнтеграции(НастройкаИнтеграции) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + СтруктураНастроек = пбп_ОбщегоНазначенияСлужебный.ЗначенияРеквизитовОбъекта( + НастройкаИнтеграции, "СтрокаПодключения, Порт, ИмяОбъекта"); + ДанныеБезопасногоХранилища = пбп_ОбщегоНазначенияСлужебный.ПрочитатьДанныеИзБезопасногоХранилища(НастройкаИнтеграции); + + Для Каждого КлючИЗначение Из ДанныеБезопасногоХранилища Цикл + СтруктураНастроек.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); + КонецЦикла; + + УстановитьПривилегированныйРежим(Ложь); + + Возврат СтруктураНастроек; + +КонецФункции + +// Возвращает структуру с настройками для интеграции +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - +// ссылка на элемент справочника интеграционные потоки +// +// Возвращаемое значение: +// Структура +Функция ПолучитьСтруктуруПотокаИНастроекИнтеграции(ИнтеграционныйПоток) Экспорт + + СтруктураПотокаИНастроек = пбп_ОбщегоНазначенияСлужебный.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции, ТочкаВхода"); + СтруктураНастроек = ПолучитьСтруктуруНастроекИнтеграции(СтруктураПотокаИНастроек.НастройкаИнтеграции); + пбп_ОбщегоНазначенияСлужебныйКлиентСервер.ДополнитьСтруктуру(СтруктураПотокаИНастроек, СтруктураНастроек); + + Возврат СтруктураПотокаИНастроек; + +КонецФункции + +// Получает структуру параметров интеграционного потока со значениями по умолчанию +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - ссылка на метод, параметры которого получаем. +// ЗаполнятьПоУмолчанию - Булево - добавлять ли в возвращаемую структуру значения по умолчанию +// - Ложь - возвращает структуру вида ИмяПараметра<Строка>:ТипЗначения<ПеречислениеСсылка.пбп_ТипыJSON> +// - Истина - возвращает структуру вида ИмяПараметра<Строка>:ЗначениеПоУмолчанию<Строка> +// +// Возвращаемое значение: +// Структура +// +Функция ПолучитьСтруктуруПараметровВхода(ИнтеграционныйПоток, ЗаполнятьПоУмолчанию = Ложь) Экспорт + + Возврат Справочники.пбп_ИнтеграционныеПотоки.ПолучитьСтруктуруПараметровВхода( + ИнтеграционныйПоток, ЗаполнятьПоУмолчанию); + +КонецФункции + +// Получает предопределенный метод интеграции по идентификатору настройки +// +// Параметры: +// ИдентификаторНастройки - Строка - +// строковый идентификатор предопределенного значения, реквизит ИдентификаторНастройки +// +// Возвращаемое значение: +// СправочникСсылка.пбп_МетодыИнтеграции - искомый метод интеграции +// +Функция ИнтеграционныйПоток(ИдентификаторНастройки) Экспорт + Возврат Справочники.пбп_ИнтеграционныеПотоки.НайтиПоРеквизиту("ИдентификаторНастройки", ИдентификаторНастройки); +КонецФункции + +// Получает предопределенную интегрируемую систему по идентификатору настройки +// +// Параметры: +// ИдентификаторНастройки - Строка - +// строковый идентификатор предопределенного значения, реквизит ИдентификаторНастройки +// +// Возвращаемое значение: +// СправочникСсылка.пбп_ИнтегрируемыеСистемы - искомая система интеграции +// +Функция ИнтегрируемаяСистема(ИдентификаторНастройки) Экспорт + Возврат Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту("ИдентификаторНастройки", ИдентификаторНастройки); +КонецФункции + +// Получает предопределенную настройку интеграции по идентификатору настройки +// +// Параметры: +// ИдентификаторНастройки - Строка - +// строковый идентификатор предопределенного значения, реквизит ИдентификаторНастройки +// +// Возвращаемое значение: +// СправочникСсылка.пбп_НастройкиИнтеграции - искомая настройка интеграции +// +Функция НастройкаИнтеграции(ИдентификаторНастройки) Экспорт + Возврат Справочники.пбп_НастройкиИнтеграции.НайтиПоРеквизиту("ИдентификаторНастройки", ИдентификаторНастройки); +КонецФункции + +#КонецОбласти // РаботаСДанными + +#КонецОбласти // СлужебныйПрограммныйИнтерфейс + +#Область СлужебныеПроцедурыИФункции + +// Процедура обрабатывает запросы в структуре записи истории +// +// Параметры: +// СтруктураЗаписиИстории - Структура - см. ПолучитьСтруктуруЗаписиИстории +// +Процедура ДополнительноОбработатьЗапросыИнтеграцииПередЗаписьюВИсторию(СтруктураЗаписиИстории) + + Если НЕ ПустаяСтрока(СтруктураЗаписиИстории.ИсходящееСообщение) + И СтрНайти(СтруктураЗаписиИстории.ИсходящееСообщение, "xml") <> 0 Тогда + + ОчиститьДлинныеАтрибутыСообщенияXML(СтруктураЗаписиИстории.ИсходящееСообщение); + + КонецЕсли; + + Если НЕ ПустаяСтрока(СтруктураЗаписиИстории.ВходящееСообщение) + И СтрНайти(СтруктураЗаписиИстории.ВходящееСообщение, "xml") <> 0 Тогда + + ОчиститьДлинныеАтрибутыСообщенияXML(СтруктураЗаписиИстории.ВходящееСообщение); + + КонецЕсли; + +КонецПроцедуры + +// Процедура очищает XML строку от длинных записей (например base64 строк) +// +// Параметры: +// XMLСтрока - Строка - XML-текст, которые необходимо преобразовать +// +Процедура ОчиститьДлинныеАтрибутыСообщенияXML(XMLСтрока) + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(XMLСтрока); + + ПостроительDOM = Новый ПостроительDOM; + ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); + + ТребуетсяПерезаписатьXML = Ложь; + + // Перебрать все узлы + МаксимальныйРазмерСтроки = 1000; + ИтераторДерева = Новый ОбходДереваDOM(ДокументDOM); + Пока ИтераторДерева.СледующийУзел() <> Неопределено Цикл + Если ТипЗнч(ИтераторДерева.ТекущийУзел) = Тип("ЭлементDOM") Тогда + Если СтрДлина(ИтераторДерева.ТекущийУзел.ТекстовоеСодержимое) > МаксимальныйРазмерСтроки Тогда + ИтераторДерева.ТекущийУзел.ТекстовоеСодержимое = "X"; + ТребуетсяПерезаписатьXML = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если ТребуетсяПерезаписатьXML Тогда + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(Новый ПараметрыЗаписиXML(, , Истина, Истина)); + + ЗаписьDOM = Новый ЗаписьDOM; + ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML); + + XMLСтрока = ЗаписьXML.Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти // СлужебныеПроцедурыИФункции \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" index f3c4616d..5359b57d 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" @@ -74,7 +74,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "ПроектнаяБиблиотекаПодсистем"; - Описание.Версия = "1.0.2.6"; + Описание.Версия = "1.0.2.7"; // Требуется библиотека стандартных подсистем. Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы"); diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\321\200\320\265\320\264\320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\275\321\213\320\265\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\321\200\320\265\320\264\320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\275\321\213\320\265\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/Ext/Module.bsl" index da64f2b2..7f7f1850 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\321\200\320\265\320\264\320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\275\321\213\320\265\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\237\321\200\320\265\320\264\320\276\320\277\321\200\320\265\320\264\320\265\320\273\320\265\320\275\320\275\321\213\320\265\320\227\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\237\320\265\321\200\320\265\320\276\320\277\321\200\320\265\320\264\320\265\320\273\321\217\320\265\320\274\321\213\320\271/Ext/Module.bsl" @@ -132,21 +132,17 @@ НоваяНастройка.Наименование = "Интеграция с системой N"; НоваяНастройка.ИдентификаторНастройки = "ИнтеграцияССистемойN"; - НаименованиеРеквизита = "ИдентификаторНастройки"; - НоваяНастройка = Результат.Добавить(); НоваяНастройка.Наименование = "Rabbit Mq"; НоваяНастройка.ИдентификаторНастройки = "RabbitMq"; - НоваяНастройка.ИнтегрируемаяСистема = Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту( - НаименованиеРеквизита, "RabbitMq"); + НоваяНастройка.ИнтегрируемаяСистема = пбп_ИнтеграцииСлужебный.ИнтегрируемаяСистема("RabbitMq"); НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.RabbitMq; НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; НоваяНастройка = Результат.Добавить(); НоваяНастройка.Наименование = "Simple Kafka"; НоваяНастройка.ИдентификаторНастройки = "SimpleKafka"; - НоваяНастройка.ИнтегрируемаяСистема = Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту( - НаименованиеРеквизита, "Kafka"); + НоваяНастройка.ИнтегрируемаяСистема = пбп_ИнтеграцииСлужебный.ИнтегрируемаяСистема("Kafka"); НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.Kafka; НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; @@ -154,8 +150,7 @@ НоваяНастройка.Наименование = "Active directory"; НоваяНастройка.ИдентификаторНастройки = "ActiveDirectory"; НоваяНастройка.СтрокаПодключения = "Provider=""ADsDSOObject"""; - НоваяНастройка.ИнтегрируемаяСистема = Справочники.пбп_ИнтегрируемыеСистемы.НайтиПоРеквизиту( - НаименованиеРеквизита, "ActiveDirectory"); + НоваяНастройка.ИнтегрируемаяСистема = пбп_ИнтеграцииСлужебный.ИнтегрируемаяСистема("ActiveDirectory"); НоваяНастройка.ТипИнтеграции = Справочники.пбп_ТипыИнтеграций.COM; НоваяНастройка.ТипАвторизации = Перечисления.пбп_ТипыАвторизации.Базовая; НоваяНастройка.ИмяОбъекта = "ADODB.Connection"; diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202.xml" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202.xml" new file mode 100644 index 00000000..74d78ed8 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202.xml" @@ -0,0 +1,23 @@ + + + + + пбп_ФайловаяСистемаКлиент + + + ru + Файловая система клиент + + + + false + true + false + false + false + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" new file mode 100644 index 00000000..8842f0bd --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" @@ -0,0 +1,100 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8, +// включая доработку типовых конфигураций. +// +// Copyright First BIT company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// URL: https://github.com/firstBitSportivnaya/PSSL/ +// + +//////////////////////////////////////////////////////////////////////////////// +// Файловая система клиент: аналог модуля БСП + +#Область ПрограммныйИнтерфейс + +// Аналог метода БСП. Получение имени временного каталога. +// +// Параметры: +// Оповещение - ОписаниеОповещения - оповещение о результате получения со следующими параметрами. +// -- ИмяКаталога - Строка - путь к созданному каталогу. +// -- ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. +// Расширение - Строка - суффикс в имени каталога, который поможет идентифицировать каталог при анализе. +// +Процедура СоздатьВременныйКаталог(Знач Оповещение, Расширение = "") Экспорт + + Контекст = Новый Структура; + Контекст.Вставить("Оповещение", Оповещение); + Контекст.Вставить("Расширение", Расширение); + + Оповещение = Новый ОписаниеОповещения("СоздатьВременныйКаталогПослеПроверкиРасширенияРаботыСФайлами", + пбп_ФайловаяСистемаСлужебныйКлиент, Контекст); + ПодключитьРасширениеДляРаботыСФайлами(Оповещение, + НСтр("ru = 'Для создания временной папки установите расширение для работы с 1С:Предприятием.'"), Ложь); + +КонецПроцедуры + +// Аналог метода БСП. Предлагает пользователю установить расширение для работы с 1С:Предприятием в веб-клиенте. +// Предназначена для использования в начале участков кода, в которых ведется работа с файлами. +// +// Параметры: +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, которая будет вызвана после закрытия +// формы со следующими параметрами: +// -- РасширениеПодключено - Булево - Истина, если расширение было подключено. +// -- ДополнительныеПараметры - Произвольный - параметры, заданные в ОписаниеОповещенияОЗакрытии. +// ТекстПредложения - Строка - текст сообщения. Если не указан, то выводится текст по умолчанию. +// ВозможноПродолжениеБезУстановки - Булево - если Истина, будет показана кнопка ПродолжитьБезУстановки, +// если Ложь, будет показана кнопка Отмена. +// +// Пример: +// +// Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект); +// ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение для работы с 1С:Предприятием.'"); +// ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение, ТекстСообщения); +// +// Процедура ПечатьДокументаЗавершение(РасширениеПодключено, ДополнительныеПараметры) Экспорт +// Если РасширениеПодключено Тогда +// // код печати документа, рассчитывающий на то, что расширение подключено. +// // ... +// Иначе +// // код печати документа, который работает без подключенного расширения. +// // ... +// КонецЕсли; +// +Процедура ПодключитьРасширениеДляРаботыСФайлами( + ОписаниеОповещенияОЗакрытии, + ТекстПредложения = "", + ВозможноПродолжениеБезУстановки = Истина) Экспорт + + ОписаниеОповещенияЗавершение = Новый ОписаниеОповещения( + "НачатьПодключениеРасширенияРаботыСФайламиПриОтветеНаВопросОбУстановке", пбп_ФайловаяСистемаСлужебныйКлиент, + ОписаниеОповещенияОЗакрытии); + +#Если Не ВебКлиент Тогда + // В мобильном, тонком и толстом клиентах расширение подключено всегда. + ВыполнитьОбработкуОповещения(ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется"); + Возврат; +#КонецЕсли + + Контекст = Новый Структура; + Контекст.Вставить("ОписаниеОповещенияЗавершение", ОписаниеОповещенияЗавершение); + Контекст.Вставить("ТекстПредложения", ТекстПредложения); + Контекст.Вставить("ВозможноПродолжениеБезУстановки", ВозможноПродолжениеБезУстановки); + + Оповещение = Новый ОписаниеОповещения( + "НачатьПодключениеРасширенияРаботыСФайламиПриУстановкеРасширения", пбп_ФайловаяСистемаСлужебныйКлиент, Контекст); + НачатьПодключениеРасширенияРаботыСФайлами(Оповещение); + +КонецПроцедуры + +#КонецОбласти // ПрограммныйИнтерфейс \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217.xml" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217.xml" new file mode 100644 index 00000000..4aa41d5d --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217.xml" @@ -0,0 +1,23 @@ + + + + + пбп_ФайловаяСистемаКлиентПереадресация + + + ru + Файловая система клиент переадресация + + + + false + true + false + false + false + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" new file mode 100644 index 00000000..a3de5e79 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\232\320\273\320\270\320\265\320\275\321\202\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" @@ -0,0 +1,51 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8, +// включая доработку типовых конфигураций. +// +// Copyright First BIT company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// URL: https://github.com/firstBitSportivnaya/PSSL/ +// + +#Область СлужебныйПрограммныйИнтерфейс + +// См. пбп_ФайловаяСистемаКлиент.СоздатьВременныйКаталог. +Процедура СоздатьВременныйКаталог(Знач Оповещение, Расширение = "") Экспорт + + Модуль = ПолучитьМодуль(); + Модуль.СоздатьВременныйКаталог(Оповещение, Расширение); + +КонецПроцедуры + +// См. пбп_ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами. +Процедура ПодключитьРасширениеДляРаботыСФайлами( + ОписаниеОповещенияОЗакрытии, + ТекстПредложения = "", + ВозможноПродолжениеБезУстановки = Истина) Экспорт + + Модуль = ПолучитьМодуль(); + Модуль.ПодключитьРасширениеДляРаботыСФайлами(ОписаниеОповещенияОЗакрытии, + ТекстПредложения, ВозможноПродолжениеБезУстановки); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьМодуль() + Возврат пбп_ОбщегоНазначенияКлиент.ОбщийМодуль("ФайловаяСистемаКлиент", "пбп_ФайловаяСистемаКлиент"); +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" index af7da006..e7e5768c 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" @@ -29,22 +29,22 @@ КонецПроцедуры // См. пбп_ФайловаяСистема.ПараметрыЗапускаПрограммы. -Процедура ПараметрыЗапускаПрограммы() Экспорт +Функция ПараметрыЗапускаПрограммы() Экспорт Модуль = ПолучитьМодуль(); - Модуль.ПараметрыЗапускаПрограммы(); + Возврат Модуль.ПараметрыЗапускаПрограммы(); -КонецПроцедуры +КонецФункции // См. пбп_ФайловаяСистема.ЗапуститьПрограмму. -Процедура ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт +Функция ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт Модуль = ПолучитьМодуль(); // BSLLS:ExternalAppStarting-off - Модуль.ЗапуститьПрограмму(КомандаЗапуска, ПараметрыЗапускаПрограммы); + Возврат Модуль.ЗапуститьПрограмму(КомандаЗапуска, ПараметрыЗапускаПрограммы); // BSLLS:ExternalAppStarting-on -КонецПроцедуры +КонецФункции #КонецОбласти diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.xml" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.xml" new file mode 100644 index 00000000..02cf8220 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.xml" @@ -0,0 +1,23 @@ + + + + + пбп_ФайловаяСистемаСлужебныйКлиент + + + ru + Файловая система служебный клиент + + + + false + true + false + false + false + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" new file mode 100644 index 00000000..e9dac51d --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Ext/Module.bsl" @@ -0,0 +1,120 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8, +// включая доработку типовых конфигураций. +// +// Copyright First BIT company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// URL: https://github.com/firstBitSportivnaya/PSSL/ +// + +//////////////////////////////////////////////////////////////////////////////// +// Файловая система служебный клиент: аналог модуля БСП + +#Область СлужебныйПрограммныйИнтерфейс + +#Область РасширениеРаботыСФайлами + +Процедура НачатьПодключениеРасширенияРаботыСФайламиПриУстановкеРасширения(Подключено, Контекст) Экспорт + + // Если расширение и так уже подключено, незачем про него спрашивать. + Если Подключено Тогда + ВыполнитьОбработкуОповещения(Контекст.ОписаниеОповещенияЗавершение, "ПодключениеНеТребуется"); + Возврат; + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Невозможно работать с файловой системой из браузера';"); + +КонецПроцедуры + +Процедура НачатьПодключениеРасширенияРаботыСФайламиПриОтветеНаВопросОбУстановке(Действие, ОповещениеОЗакрытии) Экспорт + + РасширениеПодключено = (Действие = "РасширениеПодключено" Или Действие = "ПодключениеНеТребуется"); + + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, РасширениеПодключено); + +КонецПроцедуры + +#КонецОбласти // РасширениеРаботыСФайлами + +#Область ВременныеФайлы + +#Область СоздатьВременныйКаталог + +// Аналог метода БСП. Продолжение процедуры ФайловаяСистемаКлиент.СоздатьВременныйКаталог. +// +// Параметры: +// РасширениеПодключено - Булево +// Контекст - Структура: +// * Оповещение - ОписаниеОповещения +// * Расширение - Строка +// +Процедура СоздатьВременныйКаталогПослеПроверкиРасширенияРаботыСФайлами(РасширениеПодключено, Контекст) Экспорт + + Если РасширениеПодключено Тогда + Оповещение = Новый ОписаниеОповещения( + "СоздатьВременныйКаталогПослеПолученияВременногоКаталога", ЭтотОбъект, Контекст, + "СоздатьВременныйКаталогПриОбработкеОшибки", ЭтотОбъект); + НачатьПолучениеКаталогаВременныхФайлов(Оповещение); + Иначе + СоздатьВременныйКаталогОповеститьОбОшибке(НСтр("ru = 'Не удалось установить расширение для работы с 1С:Предприятием.'"), Контекст); + КонецЕсли; + +КонецПроцедуры + +// Аналог метода БСП. Продолжение процедуры ФайловаяСистемаКлиент.СоздатьВременныйКаталог. +// +// Параметры: +// ИмяКаталогаВременныхФайлов - Строка +// Контекст - Структура: +// * Оповещение - ОписаниеОповещения +// * Расширение - Строка +// +Процедура СоздатьВременныйКаталогПослеПолученияВременногоКаталога(ИмяКаталогаВременныхФайлов, Контекст) Экспорт + + Оповещение = Контекст.Оповещение; + Расширение = Контекст.Расширение; + + ИмяКаталога = "v8_" + Строка(Новый УникальныйИдентификатор); + + Если Не ПустаяСтрока(Расширение) Тогда + ИмяКаталога = ИмяКаталога + "." + Расширение; + КонецЕсли; + + НачатьСозданиеКаталога(Оповещение, ИмяКаталогаВременныхФайлов + ИмяКаталога); + +КонецПроцедуры + +// Аналог метода БСП. Продолжение процедуры ФайловаяСистемаКлиент.СоздатьВременныйКаталог. +Процедура СоздатьВременныйКаталогПриОбработкеОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт + + СтандартнаяОбработка = Ложь; + ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + СоздатьВременныйКаталогОповеститьОбОшибке(ОписаниеОшибки, Контекст); + +КонецПроцедуры + +// Аналог метода БСП. Продолжение процедуры ФайловаяСистемаКлиент.СоздатьВременныйКаталог. +Процедура СоздатьВременныйКаталогОповеститьОбОшибке(ОписаниеОшибки, Контекст) + + ПоказатьПредупреждение(, ОписаниеОшибки); + ИмяКаталога = ""; + ВыполнитьОбработкуОповещения(Контекст.Оповещение, ИмяКаталога); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти // СлужебныйПрограммныйИнтерфейс \ No newline at end of file diff --git a/src/cf/Configuration.xml b/src/cf/Configuration.xml index fa8924ac..88705457 100644 --- a/src/cf/Configuration.xml +++ b/src/cf/Configuration.xml @@ -57,7 +57,7 @@ Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок Первый БИТ - 1.0.2.6 + 1.0.2.7 false false @@ -266,6 +266,7 @@ пбп_ЧтениеПланаВидовХарактеристикПредопределенныеЗначения пбп_ЧтениеРегистраСведенийСоответствияОбъектовИБ пбп_ЧтениеТиповСоответствияОбъектовИБ + пбп_ПросмотрИсторииИнтеграции ПолныеПрава пбп_BSLEditor пбп_JSONEditor @@ -278,6 +279,8 @@ пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент пбп_ИнтеграцииСервер + пбп_ИнтеграцииСлужебный + пбп_ИнтеграцииFTPSFTP пбп_КоннекторHTTP пбп_МетодыРегламентныхЗаданийСервер пбп_МодификацияКонфигурацииКлиентПереопределяемый @@ -320,6 +323,9 @@ пбп_СхемыЗапросов пбп_ФайловаяСистема пбп_ФайловаяСистемаПереадресация + пбп_ФайловаяСистемаКлиентПереадресация + пбп_ФайловаяСистемаКлиент + пбп_ФайловаяСистемаСлужебныйКлиент пбп_ДокументыОбработкаЗаполнения пбп_ДокументыОбработкаПроведения пбп_ДокументыОбработкаПроверкиЗаполнения diff --git "a/src/cf/Roles/\320\277\320\261\320\277_\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\230\321\201\321\202\320\276\321\200\320\270\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.xml" "b/src/cf/Roles/\320\277\320\261\320\277_\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\230\321\201\321\202\320\276\321\200\320\270\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.xml" new file mode 100644 index 00000000..922f176f --- /dev/null +++ "b/src/cf/Roles/\320\277\320\261\320\277_\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\230\321\201\321\202\320\276\321\200\320\270\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270.xml" @@ -0,0 +1,15 @@ + + + + + пбп_ПросмотрИсторииИнтеграции + + + ru + Просмотр истории интеграции + + + + + + \ No newline at end of file diff --git "a/src/cf/Roles/\320\277\320\261\320\277_\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\230\321\201\321\202\320\276\321\200\320\270\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Ext/Rights.xml" "b/src/cf/Roles/\320\277\320\261\320\277_\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\230\321\201\321\202\320\276\321\200\320\270\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Ext/Rights.xml" new file mode 100644 index 00000000..01e8e935 --- /dev/null +++ "b/src/cf/Roles/\320\277\320\261\320\277_\320\237\321\200\320\276\321\201\320\274\320\276\321\202\321\200\320\230\321\201\321\202\320\276\321\200\320\270\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Ext/Rights.xml" @@ -0,0 +1,44 @@ + + + false + true + false + + Configuration.ПроектнаяБиблиотекаПодсистем + + MainWindowModeNormal + true + + + MainWindowModeWorkplace + true + + + MainWindowModeEmbeddedWorkplace + true + + + MainWindowModeFullscreenWorkplace + true + + + MainWindowModeKiosk + true + + + AnalyticsSystemClient + true + + + + Catalog.пбп_ИсторияИнтеграции + + Read + true + + + View + true + + + \ No newline at end of file diff --git "a/src/cf/Subsystems/\320\277\320\261\320\277_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.xml" "b/src/cf/Subsystems/\320\277\320\261\320\277_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.xml" index 1eeddb1c..6f0d22c9 100644 --- "a/src/cf/Subsystems/\320\277\320\261\320\277_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.xml" +++ "b/src/cf/Subsystems/\320\277\320\261\320\277_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217\320\274\320\270.xml" @@ -46,6 +46,9 @@ DefinedType.пбп_Пользователи DefinedType.пбп_УчетныеЗаписиЭлектроннойПочты Enum.пбп_ТипыАвторизации + Role.пбп_ПросмотрИсторииИнтеграции + CommonModule.пбп_ИнтеграцииСлужебный + CommonModule.пбп_ИнтеграцииFTPSFTP From 28793f1281b85deb83f11329baf146aa2c47bdc6 Mon Sep 17 00:00:00 2001 From: Ivan Smirnov <52702497+ivanmolodec@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:49:37 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=B8-=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .coderabbit.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 00000000..453efeb2 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,16 @@ +# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json +language: "ru-RU" +early_access: false +enable_free_tier: true +reviews: + profile: "chill" + request_changes_workflow: false + high_level_summary: true + poem: false + review_status: true + collapse_walkthrough: false + auto_review: + enabled: true + drafts: false +chat: + auto_reply: true \ No newline at end of file