diff --git a/.bsl-language-server.json b/.bsl-language-server.json
index ec9744e..43d8e81 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/пбп_ИсторияИнтеграции.xml b/src/cf/Catalogs/пбп_ИсторияИнтеграции.xml
index 346971c..adf6987 100644
--- a/src/cf/Catalogs/пбп_ИсторияИнтеграции.xml
+++ b/src/cf/Catalogs/пбп_ИсторияИнтеграции.xml
@@ -1001,6 +1001,90 @@
Use
+
+
+ ИмяФайлаСообщения
+
+
+ ru
+ Имя файла сообщения
+
+
+
+
+ xs:string
+
+ 150
+ Variable
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+
+ DontIndex
+ Use
+ Use
+
+
+
+
+ ФайлСообщения
+
+
+ ru
+ Файл сообщения
+
+
+
+
+ v8:ValueStorage
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+
+ DontIndex
+ Use
+ Use
+
+
diff --git a/src/cf/Catalogs/пбп_ИсторияИнтеграции/Ext/ObjectModule.bsl b/src/cf/Catalogs/пбп_ИсторияИнтеграции/Ext/ObjectModule.bsl
index 0b072f1..ab4851a 100644
--- a/src/cf/Catalogs/пбп_ИсторияИнтеграции/Ext/ObjectModule.bsl
+++ b/src/cf/Catalogs/пбп_ИсторияИнтеграции/Ext/ObjectModule.bsl
@@ -20,6 +20,16 @@
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
+#Область СлужебныйПрограммныйИнтерфейс
+
+Функция ПолучитьДанныеФайлаСообщения() Экспорт
+
+ Возврат ФайлСообщения.Получить();
+
+КонецФункции
+
+#КонецОбласти // СлужебныйПрограммныйИнтерфейс
+
#Область ОбработчикиСобытий
Процедура ПередУдалением(Отказ)
diff --git a/src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form.xml b/src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form.xml
index a3658f2..c5f00b6 100644
--- a/src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form.xml
+++ b/src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form.xml
@@ -284,13 +284,47 @@
-
+
ЗапросИсходящийОтформатированный
None
EnterOnInput
-
-
+
+
+
+
+
+ ru
+ Группа данные сообщения исходящего
+
+
+
+
+ ru
+ Группа данные сообщения исходящего
+
+
+ None
+ false
+
+
+
+
+
+ ru
+ Прикрепленный файл обмена:
+
+
+
+
+
+
+
+
@@ -313,13 +347,47 @@
-
+
ЗапросВходящийОтформатированный
None
EnterOnInput
-
-
+
+
+
+
+
+ ru
+ Группа данные сообщения входящего
+
+
+
+
+ ru
+ Группа данные сообщения исходящего
+
+
+ None
+ false
+
+
+
+
+
+ ru
+ Прикрепленный файл обмена:
+
+
+
+
+
+
+
+
@@ -586,5 +654,20 @@
КопироватьВБуферОбмена
TextPicture
+
+
+
+ ru
+ Сохранить файл сообщения обмена
+
+
+
+
+ ru
+ Сохранить файл сообщения обмена
+
+
+ СохранитьФайлСообщенияОбмена
+
\ No newline at end of file
diff --git a/src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form/Module.bsl b/src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form/Module.bsl
index 529171f..e90ccbf 100644
--- a/src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form/Module.bsl
+++ b/src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/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/пбп_ИнтеграцииFTPSFTP.xml b/src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP.xml
new file mode 100644
index 0000000..d1e039c
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP.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/пбп_ИнтеграцииFTPSFTP/Ext/Module.bsl b/src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP/Ext/Module.bsl
new file mode 100644
index 0000000..5dc2e80
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP/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/пбп_ИнтеграцииСервер/Ext/Module.bsl b/src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl
index 28eaf41..9fed4fa 100644
--- a/src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl
+++ b/src/cf/CommonModules/пбп_ИнтеграцииСервер/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,182 +389,62 @@
#Область SFTP
// Отправляет сообщение на SFTP-сервер.
-// Для отправки на ОС Linux используется одна из установленных утилит:
-// 1) curl;
-// 2) sshpass;
-// 4) expect.
-// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности).
-// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером.
+// См. пбп_ИнтеграцииFTPSFTP.ОтправитьСообщениеSFTP.
//
-// Для отправки на ОС Windows используется WinSCP.
+Функция ОтправитьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории = Неопределено) Экспорт
+
+ Возврат пбп_ИнтеграцииFTPSFTP.ОтправитьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения, СтруктураИстории);
+
+КонецФункции
+
+// Получает список файлов с каталога SFTP-сервера.
+// См. пбп_ИнтеграцииFTPSFTP.ПолучитьСодержимоеКаталогаSFTP.
//
-// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка.
-//
-// Параметры:
-// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток,
-// для которого выполняется подключение к FTP-серверу
-// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP)
-//
-// Возвращаемое значение:
-// Строка - описание ошибки
-//
-Функция ОтправитьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения) Экспорт
+Функция ПолучитьСодержимоеКаталогаSFTP(ИнтеграционныйПоток, КаталогПоиска, СтруктураИстории = Неопределено) Экспорт
- ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток);
-
- Если ПустаяСтрока(ПараметрыСообщения.Путь) Тогда
- // BSLLS:MissingTemporaryFileDeletion-off
- // Необходимо пропустить проверку, так как файл удаляется позже
- НовыйФайл = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение);
- // BSLLS:MissingTemporaryFileDeletion-on
- ПараметрыСообщения.Данные.Записать(НовыйФайл);
- ПараметрыСообщения.Путь = НовыйФайл;
- КонецЕсли;
-
- СообщениеОбОшибке = ОпределитьТипОтправкиИОтправитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения);
-
- Возврат СообщениеОбОшибке;
+ Возврат пбп_ИнтеграцииFTPSFTP.ПолучитьСодержимоеКаталогаSFTP(ИнтеграционныйПоток, КаталогПоиска, СтруктураИстории);
КонецФункции
// Проверяет наличие файла на SFTP
-//
-// Параметры:
-// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток,
-// для которого выполняется подключение к FTP-серверу
-// ИмяФайла - Строка - имя искомого файла
-// КаталогПоиска - Строка - каталог поиска файла на FTP-сервере
-// ПоТочномуСовпадению - Булево - если Истина, то поиск на равенство, если Ложь - по вхождению
-//
-// Возвращаемое значение:
-// Булево - файл найден
+// См. пбп_ИнтеграцииFTPSFTP.ПроверитьФайлЕстьНаSFTP.
//
Функция ПроверитьФайлЕстьНаSFTP(ИнтеграционныйПоток,
- ИмяФайла, КаталогПоиска = "/", ПоТочномуСовпадению = Истина) Экспорт
+ ИмяФайла, КаталогПоиска = "/", ПоТочномуСовпадению = Истина, СтруктураИстории = Неопределено) Экспорт
- ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, Ложь);
- ПараметрыСоединения.КаталогИсходящие = КаталогПоиска;
-
- Результат = Ложь;
-
- ФайлыНаРесурсе = ОпределитьТипЧтенияИПрочитатьСодержимоеНаSFTP(ПараметрыСоединения);
- Если ТипЗнч(ФайлыНаРесурсе) = Тип("Строка") Тогда
- Возврат ФайлыНаРесурсе;
- КонецЕсли;
-
- Для Каждого ФайлНаСервере Из ФайлыНаРесурсе Цикл
- Если ПоТочномуСовпадению Тогда
- Если ВРег(ФайлНаСервере) = ВРег(ИмяФайла) Тогда
- Результат = Истина;
- Прервать;
- КонецЕсли;
- Иначе
- Если СтрНайти(ВРег(ФайлНаСервере), ВРег(ИмяФайла), НаправлениеПоиска.СНачала) > 0 Тогда
- Результат = Истина;
- Прервать;
- КонецЕсли;
- КонецЕсли;
- КонецЦикла;
-
- Возврат Результат;
+ Возврат пбп_ИнтеграцииFTPSFTP.ПроверитьФайлЕстьНаSFTP(ИмяФайла,
+ КаталогПоиска, ПоТочномуСовпадению, СтруктураИстории);
КонецФункции
// Получает сообщение с SFTP-сервера.
-// Путь к полученному файлу будет лежать в ключе "Путь" структуры ПараметрыСообщения.
+// См. пбп_ИнтеграцииFTPSFTP.ПрочитатьСообщениеSFTP.
//
-// Для получения файлов на ОС Linux используется одна из установленных утилит:
-// 1) curl;
-// 2) sshpass;
-// 4) expect.
-// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности).
-// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером.
-//
-// Для получения на ОС Windows используется WinSCP.
-//
-// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка.
-//
-// Параметры:
-// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток,
-// для которого выполняется подключение к 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/пбп_ИнтеграцииСлужебный.xml b/src/cf/CommonModules/пбп_ИнтеграцииСлужебный.xml
new file mode 100644
index 0000000..bf527aa
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ИнтеграцииСлужебный.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/пбп_ИнтеграцииСлужебный/Ext/Module.bsl b/src/cf/CommonModules/пбп_ИнтеграцииСлужебный/Ext/Module.bsl
new file mode 100644
index 0000000..d3da215
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ИнтеграцииСлужебный/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/пбп_ОбновлениеИнформационнойБазыПБП/Ext/Module.bsl b/src/cf/CommonModules/пбп_ОбновлениеИнформационнойБазыПБП/Ext/Module.bsl
index f3c4616..5359b57 100644
--- a/src/cf/CommonModules/пбп_ОбновлениеИнформационнойБазыПБП/Ext/Module.bsl
+++ b/src/cf/CommonModules/пбп_ОбновлениеИнформационнойБазыПБП/Ext/Module.bsl
@@ -74,7 +74,7 @@
Процедура ПриДобавленииПодсистемы(Описание) Экспорт
Описание.Имя = "ПроектнаяБиблиотекаПодсистем";
- Описание.Версия = "1.0.2.6";
+ Описание.Версия = "1.0.2.7";
// Требуется библиотека стандартных подсистем.
Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы");
diff --git a/src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl b/src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl
index da64f2b..7f7f185 100644
--- a/src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl
+++ b/src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/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/пбп_ФайловаяСистемаКлиент.xml b/src/cf/CommonModules/пбп_ФайловаяСистемаКлиент.xml
new file mode 100644
index 0000000..74d78ed
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ФайловаяСистемаКлиент.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/пбп_ФайловаяСистемаКлиент/Ext/Module.bsl b/src/cf/CommonModules/пбп_ФайловаяСистемаКлиент/Ext/Module.bsl
new file mode 100644
index 0000000..8842f0b
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ФайловаяСистемаКлиент/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/пбп_ФайловаяСистемаКлиентПереадресация.xml b/src/cf/CommonModules/пбп_ФайловаяСистемаКлиентПереадресация.xml
new file mode 100644
index 0000000..4aa41d5
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ФайловаяСистемаКлиентПереадресация.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/пбп_ФайловаяСистемаКлиентПереадресация/Ext/Module.bsl b/src/cf/CommonModules/пбп_ФайловаяСистемаКлиентПереадресация/Ext/Module.bsl
new file mode 100644
index 0000000..a3de5e7
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ФайловаяСистемаКлиентПереадресация/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/пбп_ФайловаяСистемаПереадресация/Ext/Module.bsl b/src/cf/CommonModules/пбп_ФайловаяСистемаПереадресация/Ext/Module.bsl
index af7da00..e7e5768 100644
--- a/src/cf/CommonModules/пбп_ФайловаяСистемаПереадресация/Ext/Module.bsl
+++ b/src/cf/CommonModules/пбп_ФайловаяСистемаПереадресация/Ext/Module.bsl
@@ -29,22 +29,22 @@
КонецПроцедуры
// См. пбп_ФайловаяСистема.ПараметрыЗапускаПрограммы.
-Процедура ПараметрыЗапускаПрограммы() Экспорт
+Функция ПараметрыЗапускаПрограммы() Экспорт
Модуль = ПолучитьМодуль();
- Модуль.ПараметрыЗапускаПрограммы();
+ Возврат Модуль.ПараметрыЗапускаПрограммы();
-КонецПроцедуры
+КонецФункции
// См. пбп_ФайловаяСистема.ЗапуститьПрограмму.
-Процедура ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт
+Функция ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт
Модуль = ПолучитьМодуль();
// BSLLS:ExternalAppStarting-off
- Модуль.ЗапуститьПрограмму(КомандаЗапуска, ПараметрыЗапускаПрограммы);
+ Возврат Модуль.ЗапуститьПрограмму(КомандаЗапуска, ПараметрыЗапускаПрограммы);
// BSLLS:ExternalAppStarting-on
-КонецПроцедуры
+КонецФункции
#КонецОбласти
diff --git a/src/cf/CommonModules/пбп_ФайловаяСистемаСлужебныйКлиент.xml b/src/cf/CommonModules/пбп_ФайловаяСистемаСлужебныйКлиент.xml
new file mode 100644
index 0000000..02cf822
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ФайловаяСистемаСлужебныйКлиент.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/пбп_ФайловаяСистемаСлужебныйКлиент/Ext/Module.bsl b/src/cf/CommonModules/пбп_ФайловаяСистемаСлужебныйКлиент/Ext/Module.bsl
new file mode 100644
index 0000000..e9dac51
--- /dev/null
+++ b/src/cf/CommonModules/пбп_ФайловаяСистемаСлужебныйКлиент/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 fa8924a..8870545 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/пбп_ПросмотрИсторииИнтеграции.xml b/src/cf/Roles/пбп_ПросмотрИсторииИнтеграции.xml
new file mode 100644
index 0000000..922f176
--- /dev/null
+++ b/src/cf/Roles/пбп_ПросмотрИсторииИнтеграции.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ пбп_ПросмотрИсторииИнтеграции
+
+
+ ru
+ Просмотр истории интеграции
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/cf/Roles/пбп_ПросмотрИсторииИнтеграции/Ext/Rights.xml b/src/cf/Roles/пбп_ПросмотрИсторииИнтеграции/Ext/Rights.xml
new file mode 100644
index 0000000..01e8e93
--- /dev/null
+++ b/src/cf/Roles/пбп_ПросмотрИсторииИнтеграции/Ext/Rights.xml
@@ -0,0 +1,44 @@
+
+
+ false
+ true
+ false
+
+
+
\ No newline at end of file
diff --git a/src/cf/Subsystems/пбп_УправлениеИнтеграциями.xml b/src/cf/Subsystems/пбп_УправлениеИнтеграциями.xml
index 1eeddb1..6f0d22c 100644
--- a/src/cf/Subsystems/пбп_УправлениеИнтеграциями.xml
+++ b/src/cf/Subsystems/пбп_УправлениеИнтеграциями.xml
@@ -46,6 +46,9 @@
DefinedType.пбп_Пользователи
DefinedType.пбп_УчетныеЗаписиЭлектроннойПочты
Enum.пбп_ТипыАвторизации
+ Role.пбп_ПросмотрИсторииИнтеграции
+ CommonModule.пбп_ИнтеграцииСлужебный
+ CommonModule.пбп_ИнтеграцииFTPSFTP