From b4b7c46a640151b37bf42e992a0d375116955deb Mon Sep 17 00:00:00 2001 From: Permichev Vladislav Date: Tue, 1 Oct 2024 19:30:10 +0300 Subject: [PATCH] Add functions for sftp linux (#113) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлены функции для работы с SFTP на ОС Linux с помощью командной строки и утилит: curl, sshpass, expect --- .../Ext/Form/Module.bsl" | 13 +- .../Ext/Form/Module.bsl" | 2 +- .../Ext/Module.bsl" | 1025 +++++++++++++++++ .../Ext/Module.bsl" | 2 +- .../Ext/Module.bsl" | 107 +- .../Ext/Module.bsl" | 28 + .../Ext/Module.bsl" | 158 ++- .../Ext/Module.bsl" | 43 +- .../Ext/Module.bsl" | 8 + ...1\201\321\202\320\265\320\274\320\260.xml" | 23 + .../Ext/Module.bsl" | 355 ++++++ ...1\201\320\260\321\206\320\270\321\217.xml" | 23 + .../Ext/Module.bsl" | 57 + src/cf/Configuration.xml | 4 +- ...1\207\320\265\320\275\320\270\321\217.xml" | 2 + 15 files changed, 1836 insertions(+), 14 deletions(-) create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260.xml" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260/Ext/Module.bsl" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217.xml" create mode 100644 "src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" diff --git "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\265\320\237\320\276\321\202\320\276\320\272\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\265\320\237\320\276\321\202\320\276\320\272\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" index 35faa43e..d09a6c9d 100644 --- "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\265\320\237\320\276\321\202\320\276\320\272\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" +++ "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\276\320\275\320\275\321\213\320\265\320\237\320\276\321\202\320\276\320\272\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" @@ -174,12 +174,21 @@ ЭлементНаследования = Справочники.пбп_ТипыИнтеграций .ПолучитьПредопределенныйЭлементНаследованияНастроекТипаИнтеграции(РеквизитыОбъекта.ТипИнтеграции); Если ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.Каталог - Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.FTPРесурсы Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.ПочтовыйКлиент Тогда УстановитьВидимостьЭлементовДляТипаФайловыеОбмены(); пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( - Элементы, "ПользовательскаяФункция", УстанавливаемоеСвойство, + Элементы, ПользовательскаяФункция, УстанавливаемоеСвойство, + РеквизитыОбъекта.ИспользоватьПользовательскиеФункции); + ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.FTPРесурсы Тогда + Элементы.ТочкаВхода.Заголовок = НСтр("ru = 'Путь к каталогу на сервере'"); + + пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "ТочкаВхода", УстанавливаемоеСвойство, Истина); + пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, "ПараметрыВхода", УстанавливаемоеСвойство, Ложь); + пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( + Элементы, ПользовательскаяФункция, УстанавливаемоеСвойство, РеквизитыОбъекта.ИспользоватьПользовательскиеФункции); ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.COM Тогда Элементы.ТочкаВхода.Заголовок = НСтр("ru = 'Функция / запрос'"); diff --git "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" index d55c1b0d..b7642b5e 100644 --- "a/src/cf/Catalogs/\320\277\320\261\320\277_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" +++ "b/src/cf/Catalogs/\320\277\320\261\320\277_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260\320\255\320\273\320\265\320\274\320\265\320\275\321\202\320\260/Ext/Form/Module.bsl" @@ -278,7 +278,7 @@ пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, СписокНастроекСтрока, УстанавливаемоеСвойство, Ложь); ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.FTPРесурсы Тогда - Элементы.СтрокаПодключения.Заголовок = НСтр("ru = 'Путь к каталогу'"); + Элементы.СтрокаПодключения.Заголовок = НСтр("ru = 'Адрес сервера'"); УстановитьВидимостьЭлементовДляТипаФайловыеОбмены(); diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" index d1f92241..28eaf418 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\320\270\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" @@ -473,6 +473,364 @@ #КонецОбласти // REST +#Область FTPSFTP + +// Параметры сообщения FTP / SFTP +// +// Возвращаемое значение: +// Структура - содержит ключи для описания сообщения обмена: +// * Путь - путь к файлу временного хранилища на сервере +// * ИмяФайла - имя файла без расширения +// * Расширение - расширение (файла без точки) +// * ДвоичныеДанные - данные файла. Если ключ "Путь" не заполнен, то его значение будет заполнено +// путем к временному файлу, сохраненного из этих двоичных данных +// +Функция ПараметрыСообщенияFTPSFTP() Экспорт + + Результат = Новый Структура("Путь, ИмяФайла, Расширение, ДвоичныеДанные"); + Возврат Результат; + +КонецФункции + +// Получить структуру параметров подключения к серверу FTP / SFTP +// +// Параметры: +// НастройкаИнтеграции - СправочникСсылка.пбп_НастройкиИнтеграции - настройка интеграции, +// для которой необходимо получить параметры +// +// Возвращаемое значение: +// Структура - Параметры соединения с сервером из настроек интеграции и безопасного хранилища +// +Функция ПолучитьПараметрыПодключенияFTPSFTP(НастройкаИнтеграции) Экспорт + + СтруктураНастроек = ПолучитьСтруктуруНастроекИнтеграции(НастройкаИнтеграции); + + ПараметрыСоединения = ПараметрыСоединенияFTPSFTP(); + ПараметрыСоединения.Адрес = СтруктураНастроек.СтрокаПодключения; + ПараметрыСоединения.Порт = Число(СтруктураНастроек.Порт); + + Если СтруктураНастроек.Свойство("Логин") Тогда + ПараметрыСоединения.ИмяПользователя = СтруктураНастроек.Логин.Значение; + Иначе + ПараметрыСоединения.ИмяПользователя = ""; + КонецЕсли; + + Если СтруктураНастроек.Свойство("Пароль") Тогда + ПараметрыСоединения.Пароль = СтруктураНастроек.Пароль.Значение; + Иначе + ПараметрыСоединения.Пароль = ""; + КонецЕсли; + + Возврат ПараметрыСоединения; + +КонецФункции + +#Область FTP + +// Выполнить подключение к FTP-серверу по настройке интеграции +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к FTP-серверу +// +// Возвращаемое значение: +// FTPСоединение, Строка - возвращает FTP-соединение по указанным настройкам, либо строку с описанием ошибки +// +Функция ВыполнитьПодключениеКFTPСерверуДляИнтеграционногоПотока(ИнтеграционныйПоток) Экспорт + + СтруктураРеквизитов = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции, ТочкаВхода"); + + ПараметрыСоединения = ПолучитьПараметрыПодключенияFTPSFTP(СтруктураРеквизитов.НастройкаИнтеграции); + + Порт = ?(Не ЗначениеЗаполнено(ПараметрыСоединения.Порт), 21, ПараметрыСоединения.Порт); + + Таймаут = 0; + + Попытка + FTPСоединение = Новый FTPСоединение(ПараметрыСоединения.Адрес, + Порт, ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, , , Таймаут); + Исключение + ЗаголовокОшибки = "Не удалось установить соединение с FTP-сервером. Подробно: "; + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", + ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + + Возврат СообщениеОбОшибке; + КонецПопытки; + + КаталогИсходящие = СтруктураРеквизитов.ТочкаВхода; + КаталогИсходящие = СокрЛП(КаталогИсходящие); + Если Лев(КаталогИсходящие, 1) <> "/" Тогда + КаталогИсходящие = "/" + КаталогИсходящие; + КонецЕсли; + + Если FTPСоединение.ТекущийКаталог() <> КаталогИсходящие Тогда + Попытка + FTPСоединение.УстановитьТекущийКаталог(КаталогИсходящие); + Исключение + ЗаголовокОшибки = "Не удалось установить каталог для исходящих на FTP-сервере. Подробно: "; + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", + ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + + Возврат СообщениеОбОшибке; + КонецПопытки; + КонецЕсли; + + Возврат FTPСоединение; + +КонецФункции + +// Отправить сообщение FTP +// +// Параметры: +// ПодключениеКFTP - FTPСоединение- текущее соединение с FTP-сервером +// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) +// +// Возвращаемое значение: +// Строка - описание ошибки +// +Функция ОтправитьСообщениеFTP(ПодключениеКFTP, ПараметрыСообщения) Экспорт + + ЗаголовокОшибки = "Файл не был создан. Подробно: "; + СообщениеОбОшибке = ""; + + Попытка + ИмяФайлаСРасширением = СтрШаблон("%1.%2", ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); + + Если ПустаяСтрока(ПараметрыСообщения.Путь) Тогда + // BSLLS:MissingTemporaryFileDeletion-off + // Необходимо пропустить проверку, так как файл удаляется позже + НовыйФайл = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); + // BSLLS:MissingTemporaryFileDeletion-on + ПараметрыСообщения.Данные.Записать(НовыйФайл); + ПараметрыСообщения.Путь = НовыйФайл; + КонецЕсли; + + ПодключениеКFTP.Записать(ПараметрыСообщения.Путь, ИмяФайлаСРасширением); + + // Повторно проверяем наличие записанного файла + КаталогИсходящие = ПодключениеКFTP.ТекущийКаталог(); + + Если Не ПроверитьФайлЕстьНаFTP(ПодключениеКFTP, ИмяФайлаСРасширением, КаталогИсходящие) Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", + ЗаголовокОшибки, "подробности уточните у администратора системы"); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + КонецЕсли; + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(НовыйФайл); + Исключение + ПолноеОписаниеОшибки = СтрШаблон("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.Получить(ИмяФайлаСРасширением, ПараметрыСообщения.Путь); + Исключение + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", + ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +// Проверяет наличие файла на 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 +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к FTP-серверу +// ИмяФайла - Строка - имя искомого файла +// КаталогПоиска - Строка - каталог поиска файла на FTP-сервере +// ПоТочномуСовпадению - Булево - если Истина, то поиск на равенство, если Ложь - по вхождению +// +// Возвращаемое значение: +// Булево - файл найден +// +Функция ПроверитьФайлЕстьНаSFTP(ИнтеграционныйПоток, + ИмяФайла, КаталогПоиска = "/", ПоТочномуСовпадению = Истина) Экспорт + + ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, Ложь); + ПараметрыСоединения.КаталогИсходящие = КаталогПоиска; + + Результат = Ложь; + + ФайлыНаРесурсе = ОпределитьТипЧтенияИПрочитатьСодержимоеНаSFTP(ПараметрыСоединения); + Если ТипЗнч(ФайлыНаРесурсе) = Тип("Строка") Тогда + Возврат ФайлыНаРесурсе; + КонецЕсли; + + Для Каждого ФайлНаСервере Из ФайлыНаРесурсе Цикл + Если ПоТочномуСовпадению Тогда + Если ВРег(ФайлНаСервере) = ВРег(ИмяФайла) Тогда + Результат = Истина; + Прервать; + КонецЕсли; + Иначе + Если СтрНайти(ВРег(ФайлНаСервере), ВРег(ИмяФайла), НаправлениеПоиска.СНачала) > 0 Тогда + Результат = Истина; + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Получает сообщение с SFTP-сервера. +// Путь к полученному файлу будет лежать в ключе "Путь" структуры ПараметрыСообщения. +// +// Для получения файлов на ОС Linux используется одна из установленных утилит: +// 1) curl; +// 2) sshpass; +// 4) expect. +// Сначала происходит проверка того, какая из утилит установлена (в указанной последовательности). +// Если одна из утилит найдена, то через нее выполняется bash-скрипт для установки соединения с SFTP-сервером. +// +// Для получения на ОС Windows используется WinSCP. +// +// Если указанные выше утилиты не найдены, то их следует установить. В противном случае, будет получена ошибка. +// +// Параметры: +// ИнтеграционныйПоток - СправочникСсылка.пбп_ИнтеграционныеПотоки - интеграционный поток, +// для которого выполняется подключение к FTP-серверу +// ПараметрыСообщения - Структура - параметры сообщения (см. ПараметрыСообщенияFTP) +// +// Возвращаемое значение: +// Строка - описание ошибки +// +Функция ПрочитатьСообщениеSFTP(ИнтеграционныйПоток, ПараметрыСообщения) Экспорт + + ПараметрыСоединения = ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток); + + СообщениеОбОшибке = ОпределитьТипПолученияИПолучитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения); + + Возврат СообщениеОбОшибке; + +КонецФункции + +#КонецОбласти // SFTP + +#КонецОбласти // FTPSFTP + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -560,4 +918,671 @@ КонецФункции +#Область FTPSFTP + +Функция ПараметрыСоединенияFTPSFTP() + + Результат = Новый Структура("Адрес, Порт, Логин, Пароль, КаталогВходящие, КаталогИсходящие"); + Возврат Результат; + +КонецФункции + +Функция ЗаполнитьПараметрыПодключенияКSFTPСерверу(ИнтеграционныйПоток, + ЗаполнитьКаталог = Истина, ИсходящееСообщение = Истина) + + СтруктураРеквизитов = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( + ИнтеграционныйПоток, "НастройкаИнтеграции, ТочкаВхода"); + + ПараметрыСоединения = ПолучитьПараметрыПодключенияFTPSFTP(СтруктураРеквизитов.НастройкаИнтеграции); + + Если ЗаполнитьКаталог Тогда + Каталог = СокрЛП(СтруктураРеквизитов.ТочкаВхода); + Если Лев(Каталог, 1) <> "/" Тогда + Каталог = "/" + Каталог; + КонецЕсли; + + Если Прав(Каталог, 1) <> "/" Тогда + Каталог = Каталог + "/"; + КонецЕсли; + + Если ИсходящееСообщение Тогда + ПараметрыСоединения.КаталогИсходящие = Каталог; + Иначе + ПараметрыСоединения.КаталогВходящие = Каталог; + КонецЕсли; + КонецЕсли; + + Возврат ПараметрыСоединения; + +КонецФункции + +#Область SFTP + +Функция ОпределитьТипОтправкиИОтправитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения) + + ЗаголовокОшибки = "Файл не был отправлен на SFTP-сервер"; + СообщениеОбОшибке = ""; + + ПутьФайлаНаСервере = СтрШаблон("%1%2.%3", ПараметрыСоединения.КаталогИсходящие, + ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); + + ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); + + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПараметрыСообщения.Путь, ПутьФайлаНаСервере); + Если ПустаяСтрока(ТекстСкрипта) Тогда + Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); + КонецЕсли; + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); + Если ЭтоLinuxСервер Тогда + РасширениеФайлаСкрипта = "sh"; + Иначе + РасширениеФайлаСкрипта = "bat"; + КонецЕсли; + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); + + СообщениеОбОшибке = ВыполнитьКомандуСистемыПриПолученииИлиОтправке( + ЭтоLinuxСервер, ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки); + + Возврат СообщениеОбОшибке; + +КонецФункции + +Функция ОпределитьТипЧтенияИПрочитатьСодержимоеНаSFTP(ПараметрыСоединения) + + ЗаголовокОшибки = "Не удалось получить содержимое папки SFTP-сервера"; + СообщениеОбОшибке = ""; + + // BSLLS:MissingTemporaryFileDeletion-off + ПутьКФайлуСодержимого = ПолучитьИмяВременногоФайла("txt"); + // BSLLS:MissingTemporaryFileDeletion-on + + ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); + + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговПоТипуОС( + ЭтоLinuxСервер, ПараметрыСоединения, ПутьКФайлуСодержимого); + Если ПустаяСтрока(ТекстСкрипта) Тогда + Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); + КонецЕсли; + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); + Если ЭтоLinuxСервер Тогда + РасширениеФайлаСкрипта = "sh"; + Иначе + РасширениеФайлаСкрипта = "bat"; + КонецЕсли; + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); + + ИмяСлужебногоФайла = ""; + + Попытка + КодВозврата = 0; + Если ЭтоLinuxСервер Тогда + ЭтоExpect = СтрНайти(ТекстСкрипта, "expect") > 0; + Если ЭтоExpect Тогда + ВспомогательныйСкрипт = СтрШаблон("#!/bin/bash + | + |expect %1 > %2", ИмяФайлаСкрипта, ПутьКФайлуСодержимого); + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ВспомогательныйСкрипт); + // BSLLS:MissingTemporaryFileDeletion-off + ИмяСлужебногоФайла = ПолучитьИмяВременногоФайла("sh"); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяСлужебногоФайла); + + ИтоговаяКоманда = "sh """ + ИмяСлужебногоФайла + """"; + Иначе + ИтоговаяКоманда = "sh """ + ИмяФайлаСкрипта + """"; + КонецЕсли; + Иначе + ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; + КонецЕсли; + + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + // BSLLS:ExternalAppStarting-off + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); + // BSLLS:ExternalAppStarting-on + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяФайлаСкрипта); + + Если Не ПустаяСтрока(ИмяСлужебногоФайла) Тогда + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяСлужебногоФайла); + КонецЕсли; + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта, ИмяСлужебногоФайла); + + Если Результат.КодВозврата <> 0 Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, + "не удалось выполнить команду системы, код возврата", КодВозврата); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + + Возврат СообщениеОбОшибке; + КонецЕсли; + + МассивФайлов = ПолучитьМассивФайловСодержимогоSFTPСервера(ПутьКФайлуСодержимого); + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ПутьКФайлуСодержимого); + + Возврат МассивФайлов; + Исключение + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта, ИмяСлужебногоФайла); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +Функция ОпределитьТипПолученияИПолучитьСообщениеНаSFTP(ПараметрыСоединения, ПараметрыСообщения) + + ЗаголовокОшибки = "Файл не был получен с SFTP-сервера"; + СообщениеОбОшибке = ""; + + ПутьФайлаНаСервере = СтрШаблон("%1%2.%3", ПараметрыСоединения.КаталогВходящие, + ПараметрыСообщения.ИмяФайла, ПараметрыСообщения.Расширение); + // BSLLS:MissingTemporaryFileDeletion-off + // Файл не должен удаляться, так как после получения с SFTP-сервера передается в обработку + ПараметрыСообщения.Путь = ПолучитьИмяВременногоФайла(ПараметрыСообщения.Расширение); + // BSLLS:MissingTemporaryFileDeletion-on + + ЭтоLinuxСервер = пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер(); + + ТекстСкрипта = ПолучитьТекстСкриптаПолученияПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПараметрыСообщения.Путь, ПутьФайлаНаСервере); + Если ПустаяСтрока(ТекстСкрипта) Тогда + Возврат ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер); + КонецЕсли; + + ДвоичныеДанныеСкрипта = ПолучитьДвоичныеДанныеИзСтроки(ТекстСкрипта); + Если ЭтоLinuxСервер Тогда + РасширениеФайлаСкрипта = "sh"; + Иначе + РасширениеФайлаСкрипта = "bat"; + КонецЕсли; + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(РасширениеФайлаСкрипта); + // BSLLS:MissingTemporaryFileDeletion-on + ДвоичныеДанныеСкрипта.Записать(ИмяФайлаСкрипта); + + СообщениеОбОшибке = ВыполнитьКомандуСистемыПриПолученииИлиОтправке( + ЭтоLinuxСервер, ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки); + + Возврат СообщениеОбОшибке; + +КонецФункции + +Процедура УдалитьВременныеФайлыСкриптов(ИмяОсновногоФайла, Знач ИмяВторогоФайла = "") + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяОсновногоФайла); + + Если Не ПустаяСтрока(ИмяВторогоФайла) Тогда + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяВторогоФайла); + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьТекстОшибкиОтсутствияУтилитыПодключенияSFTP(ЗаголовокОшибки, ЭтоLinuxСервер) + + Если ЭтоLinuxСервер Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, + "Не найдено ни одной установленной утилиты подключения к SFTP (curl, sshpass, expect)"); + Иначе + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, + "Не найдено утилиты подключения к SFTP - WinSCP"); + КонецЕсли; + + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + + Возврат СообщениеОбОшибке; + +КонецФункции + +Функция ПолучитьТекстСкриптаОтправкиПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере) + + Если ЭтоLinuxСервер Тогда + ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); + + Если ИмяУтилиты = "curl" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиCURL( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + ИначеЕсли ИмяУтилиты = "sshpass" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиSSHPASS( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + ИначеЕсли ИмяУтилиты = "expect" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиEXPECT( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + Иначе + УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); + + Если УтилитаУстановлена Тогда + ТекстСкрипта = ПолучитьТекстСкриптаОтправкиДляWinSCP(ПараметрыСоединения); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + КонецЕсли; + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаСодержимогоКаталоговПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПутьЛокальногоФайла) + + Если ЭтоLinuxСервер Тогда + ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); + + Если ИмяУтилиты = "curl" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговCURL( + ПараметрыСоединения, ПутьЛокальногоФайла); + ИначеЕсли ИмяУтилиты = "sshpass" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговSSHPASS( + ПараметрыСоединения, ПутьЛокальногоФайла); + ИначеЕсли ИмяУтилиты = "expect" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговEXPECT( + ПараметрыСоединения, ПутьЛокальногоФайла); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + Иначе + УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); + + Если УтилитаУстановлена Тогда + ТекстСкрипта = ПолучитьТекстСкриптаСодержимогоКаталоговДляWinSCP(ПараметрыСоединения); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + КонецЕсли; + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияПоТипуОС(ЭтоLinuxСервер, + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере) + + Если ЭтоLinuxСервер Тогда + ИмяУтилиты = ПолучитьИмяУтилитыПодключенияКSFTPLinux(); + + Если ИмяУтилиты = "curl" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаПолученияCURL( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + ИначеЕсли ИмяУтилиты = "sshpass" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаПолученияSSHPASS( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + ИначеЕсли ИмяУтилиты = "expect" Тогда + ТекстСкрипта = ПолучитьТекстСкриптаПолученияEXPECT( + ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + Иначе + УтилитаУстановлена = ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows(); + + Если УтилитаУстановлена Тогда + ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляWinSCP(ПараметрыСоединения); + Иначе + ТекстСкрипта = ""; + КонецЕсли; + КонецЕсли; + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьМассивФайловСодержимогоSFTPСервера(ПутьКФайлуСодержимого) + + МассивФайлов = Новый Массив; + + ЧтениеФайла = Новый ЧтениеТекста(ПутьКФайлуСодержимого); + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + НужноеКоличество = 2; + Пока ТекущаяСтрока <> Неопределено Цикл + Если Лев(ТекущаяСтрока, 1) = "-" Тогда + ЗаполнитьИмяФайлаВМассивИзСтрокиСпискаФайлов(МассивФайлов, ТекущаяСтрока, НужноеКоличество); + КонецЕсли; + + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + КонецЦикла; + + Возврат МассивФайлов; + +КонецФункции + +Процедура ЗаполнитьИмяФайлаВМассивИзСтрокиСпискаФайлов(МассивФайлов, ТекущаяСтрока, НужноеКоличество) + + // Разделяем по времени создания + МассивВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекущаяСтрока, ":"); + Если МассивВремя.Количество() = НужноеКоличество Тогда + МинутыИИмяФайла = МассивВремя[1]; + + // Время разделено от имени пробелом, но в самом имени файла тоже могут быть пробелы + МассивИмяФайла = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(МинутыИИмяФайла, " "); + + ИмяТекущегоФайла = ""; + Для Инкремент = 0 По МассивИмяФайла.Количество() - 1 Цикл + Если Инкремент = 0 Тогда + Продолжить; + КонецЕсли; + + ИмяТекущегоФайла = ИмяТекущегоФайла + МассивИмяФайла[Инкремент]; + КонецЦикла; + + МассивФайлов.Добавить(ИмяТекущегоФайла); + КонецЕсли; + +КонецПроцедуры + +Функция ВыполнитьКомандуСистемыПриПолученииИлиОтправке(ЭтоLinuxСервер, ТекстСкрипта, ИмяФайлаСкрипта, ЗаголовокОшибки) + + Попытка + КодВозврата = 0; + Если ЭтоLinuxСервер Тогда + Если СтрНайти(ТекстСкрипта, "expect") > 0 Тогда + ИтоговаяКоманда = "expect """ + ИмяФайлаСкрипта + """"; + Иначе + ИтоговаяКоманда = "sh """ + ИмяФайлаСкрипта + """"; + КонецЕсли; + Иначе + ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; + КонецЕсли; + + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + // BSLLS:ExternalAppStarting-off + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); + // BSLLS:ExternalAppStarting-on + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта); + + Если Результат.КодВозврата <> 0 Тогда + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, + "не удалось выполнить команду системы, код возврата", КодВозврата); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + КонецЕсли; + Исключение + ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); + + УдалитьВременныеФайлыСкриптов(ИмяФайлаСкрипта); + КонецПопытки; + + Возврат СообщениеОбОшибке; + +КонецФункции + +#Область SFTPWindows + +Функция ПроверитьСуществованиеУтилитыПодключенияКSFTPWindows() + + Возврат Ложь; + +КонецФункции + +Функция ПолучитьТекстСкриптаОтправкиДляWinSCP(ПараметрыСоединения) + + Возврат ""; + +КонецФункции + +Функция ПолучитьТекстСкриптаСодержимогоКаталоговДляWinSCP(ПараметрыСоединения) + + Возврат ""; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияДляWinSCP(ПараметрыСоединения) + + Возврат ""; + +КонецФункции + +#КонецОбласти // SFTPWindows + +#Область SFTPLinux + +Функция ПолучитьИмяУтилитыПодключенияКSFTPLinux() + + ИмяУстановленнойУтилиты = ""; + + МассивИменУтилит = Новый Массив; + МассивИменУтилит.Добавить("curl"); + МассивИменУтилит.Добавить("sshpass"); + МассивИменУтилит.Добавить("expect"); + + Для Каждого ИмяУтилиты Из МассивИменУтилит Цикл + Если ПроверитьСуществованиеУтилитыПодключенияКSFTPLinux(ИмяУтилиты) Тогда + ИмяУстановленнойУтилиты = ИмяУтилиты; + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат ИмяУстановленнойУтилиты; + +КонецФункции + +Функция ПроверитьСуществованиеУтилитыПодключенияКSFTPLinux(ИмяУтилиты) + + РезультатПроверки = Ложь; + + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаПроверки = ПолучитьИмяВременногоФайла("txt"); + // BSLLS:MissingTemporaryFileDeletion-on + + КомандаПроверки = СтрШаблон("command -v %1 > %2", ИмяУтилиты, ИмяФайлаПроверки); + + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + // BSLLS:ExternalAppStarting-off + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(КомандаПроверки, ПараметрыЗапускаКоманды); + // BSLLS:ExternalAppStarting-on + + Если Результат.КодВозврата = 0 Тогда + ЧтениеФайла = Новый ЧтениеТекста(ИмяФайлаПроверки); + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + Если ТекущаяСтрока <> Неопределено Тогда + РезультатПроверки = Истина; + КонецЕсли; + КонецЕсли; + + УдалитьВременныеФайлыСкриптов(ИмяФайлаПроверки); + + Возврат РезультатПроверки; + +КонецФункции + +#Область CURL + +Функция ПолучитьТекстСкриптаОтправкиCURL(ПараметрыСоединения, ПутьОтправляемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/bash + | + |curl -k ""sftp://%1%2"" --user ""%3:%4"" -T %5"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПутьФайлаНаСервере, + ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьОтправляемогоФайла); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаСодержимогоКаталоговCURL(ПараметрыСоединения, ПутьКФайлуСодержимогоКаталога) + + ТекстСкрипта = "#!/usr/bin/bash + | + |curl -k ""sftp://%1%2"" --user ""%3:%4"" > %5"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПараметрыСоединения.Каталог, + ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьКФайлуСодержимогоКаталога); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияCURL(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/bash + | + |curl -k ""sftp://%1%2"" --user ""%3:%4"" -o %5"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПутьФайлаНаСервере, + ПараметрыСоединения.Логин, ПараметрыСоединения.Пароль, ПутьСохраняемогоФайла); + + Возврат ТекстСкрипта; + +КонецФункции + +#КонецОбласти // CURL + +#Область SSHPASS + +Функция ПолучитьТекстСкриптаОтправкиSSHPASS(ПараметрыСоединения, ПутьОтправляемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/bash + | + |HOST=""%1"" + |USERNAME=""%2"" + |PASSWORD=""%3"" + |PORT=%4 + | + |sshpass -p ""$PASSWORD"" sftp -oPort=$PORT $USERNAME@$HOST < %6"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Адрес, ПараметрыСоединения.Логин, + ПараметрыСоединения.Пароль, ПараметрыСоединения.Порт, ПараметрыСоединения.КаталогИсходящие, + ПутьКФайлуСодержимогоКаталога); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияSSHPASS(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/bash + | + |HOST=""%1"" + |USERNAME=""%2"" + |PASSWORD=""%3"" + |PORT=%4 + | + |sshpass -p ""$PASSWORD"" sftp -oPort=$PORT $USERNAME@$HOST <"" + |send ""put %5 %6\n"" + |expect ""sftp>"" + |send ""exit\n"" + |interact"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, + ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПутьОтправляемогоФайла, ПутьФайлаНаСервере); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаСодержимогоКаталоговEXPECT(ПараметрыСоединения, ПутьКФайлуСодержимогоКаталога) + + ТекстСкрипта = "#!/usr/bin/expect + | + |spawn sftp -P %1 %2@%3 + |expect ""%2@%3's password:"" + |send ""%4\n"" + |expect ""sftp>"" + |send ""ls -l %5\n"" + |expect ""sftp>"" + |send ""exit\n"" + |interact"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, + ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПараметрыСоединения.КаталогИсходящие); + + Возврат ТекстСкрипта; + +КонецФункции + +Функция ПолучитьТекстСкриптаПолученияEXPECT(ПараметрыСоединения, ПутьСохраняемогоФайла, ПутьФайлаНаСервере) + + ТекстСкрипта = "#!/usr/bin/expect + | + |spawn sftp -P %1 %2@%3 + |expect ""%2@%3's password:"" + |send ""%4\n"" + |expect ""sftp>"" + |send ""get %5 %6\n"" + |expect ""sftp>"" + |send ""exit\n"" + |interact"; + + ТекстСкрипта = СтрШаблон(ТекстСкрипта, ПараметрыСоединения.Порт, ПараметрыСоединения.Логин, + ПараметрыСоединения.Адрес, ПараметрыСоединения.Пароль, ПутьФайлаНаСервере, ПутьСохраняемогоФайла); + + Возврат ТекстСкрипта; + +КонецФункции + +#КонецОбласти // EXPECT + +#КонецОбласти // SFTPLinux + +#КонецОбласти // SFTP + +#КонецОбласти // FTPSFTP + #КонецОбласти // СлужебныеПроцедурыИФункции \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" index 464e8426..f3c4616d 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\230\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\320\276\320\275\320\275\320\276\320\271\320\221\320\260\320\267\321\213\320\237\320\221\320\237/Ext/Module.bsl" @@ -74,7 +74,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "ПроектнаяБиблиотекаПодсистем"; - Описание.Версия = "1.0.2.5"; + Описание.Версия = "1.0.2.6"; // Требуется библиотека стандартных подсистем. Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы"); diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" index 41c2e0d1..1b0b65c4 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" @@ -814,6 +814,52 @@ #Область МетодыАналогиБСП +// Аналог метода БСП. Определяет режим эксплуатации информационной базы файловый (Истина) или серверный (Ложь). +// При проверке используется СтрокаСоединенияИнформационнойБазы, которую можно указать явно. +// +// Параметры: +// СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если +// нужно проверить строку соединения не текущей информационной базы. +// +// Возвращаемое значение: +// Булево - Истина, если файловая. +// +Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт + + Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда + СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы(); + КонецЕсли; + Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1; + +КонецФункции + +// Аналог метода БСП. Возвращает Истина, если функциональная подсистема существует в конфигурации. +// Предназначена для реализации вызова необязательной подсистемы (условного вызова). +// У функциональной подсистемы снят флажок "Включать в командный интерфейс". +// См. также ОбщегоНазначенияПереопределяемый.ПриОпределенииОтключенныхПодсистем +// и ОбщегоНазначенияКлиент.ПодсистемаСуществует для вызова из клиентского кода. +// +// Параметры: +// ПолноеИмяПодсистемы - Строка - полное имя объекта метаданных подсистема +// без слов "Подсистема." и с учетом регистра символов. +// Например: "СтандартныеПодсистемы.ВариантыОтчетов". +// +// Пример: +// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда +// МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); +// МодульВариантыОтчетов.<Имя метода>(); +// КонецЕсли; +// +// Возвращаемое значение: +// Булево - Истина, если подсистема существует. +// +Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт + + ИменаПодсистем = пбп_СтандартныеПодсистемыСлужебныйПовтИсп.ИменаПодсистем(); + Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено; + +КонецФункции + // Аналог метода БСП. Возвращает ссылку на общий модуль или модуль менеджера по имени. // // Параметры: @@ -1211,10 +1257,6 @@ #КонецОбласти -// Аналог метода БСП. Пока заглушка, см. ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания -Процедура ПриНачалеВыполненияРегламентногоЗадания(РегламентноеЗадание = Неопределено) Экспорт -КонецПроцедуры - // Аналог метода БСП. Возвращает структуру, содержащую значения реквизитов, прочитанные из информационной базы по ссылке на объект. // Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект // для быстрого чтения отдельных реквизитов объекта из базы данных. @@ -1477,6 +1519,25 @@ КонецФункции +// Аналог меотда БСП Возвращает код основного языка информационной базы, например "ru". +// На котором программно записываются автогенерируемые строки в информационную базу. +// Например, при начальном заполнении информационной базы данными из макета, автогенерации комментария +// к проводке или определении значения параметра ИмяСобытия метода ЗаписьЖурналаРегистрации. +// +// Возвращаемое значение: +// Строка +// +Функция КодОсновногоЯзыка() Экспорт + + Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер"); + Возврат МодульМультиязычностьСервер.КодОсновногоЯзыка(); + КонецЕсли; + + Возврат Метаданные.ОсновнойЯзык.КодЯзыка; + +КонецФункции + // Аналог метода БСП. Возвращает значения реквизитов, прочитанные из информационной базы для нескольких объектов. // Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект // для быстрого чтения отдельных реквизитов объекта из базы данных. @@ -1947,6 +2008,44 @@ КонецФункции +#Область ТекущееОкружение + +// Аналог метода БСП. Возвращает Истина, если текущий сеанс выполняется на сервере, работающем под управлением ОС Windows. +// +// Возвращаемое значение: +// Булево - Истина, если сервер работает под управлением ОС Windows. +// +Функция ЭтоWindowsСервер() Экспорт + + СистемнаяИнформация = Новый СистемнаяИнформация; + Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64; + +КонецФункции + +// Аналог метода БСП. Возвращает Истина, если текущий сеанс выполняется на сервере, работающем под управлением ОС Linux. +// +// Возвращаемое значение: +// Булево - Истина, если сервер работает под управлением ОС Linux. +// +Функция ЭтоLinuxСервер() Экспорт + + СистемнаяИнформация = Новый СистемнаяИнформация; + Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 + Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64; + +КонецФункции + +#КонецОбласти // ТекущееОкружение + +#Область Прочее + +// Аналог метода БСП. Пока заглушка, см. ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания +Процедура ПриНачалеВыполненияРегламентногоЗадания(РегламентноеЗадание = Неопределено) Экспорт +КонецПроцедуры + +#КонецОбласти // Прочее + #КонецОбласти #Область ПользовательскиеФункции diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" index 38bccb98..b8e1bad9 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Ext/Module.bsl" @@ -128,6 +128,34 @@ КонецФункции +// См. пбп_ОбщегоНазначенияСервер.ИнформационнаяБазаФайловая. +Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт + + Модуль = ПолучитьМодуль(); + Возврат Модуль.ИнформационнаяБазаФайловая(СтрокаСоединенияИнформационнойБазы); + +КонецФункции + +#Область ТекущееОкружение + +// См. пбп_ОбщегоНазначенияСервер.ЭтоWindowsСервер. +Функция ЭтоWindowsСервер() Экспорт + + Модуль = ПолучитьМодуль(); + Возврат Модуль.ЭтоWindowsСервер(); + +КонецФункции + +// См. пбп_ОбщегоНазначенияСервер.ЭтоLinuxСервер. +Функция ЭтоLinuxСервер() Экспорт + + Модуль = ПолучитьМодуль(); + Возврат Модуль.ЭтоLinuxСервер(); + +КонецФункции + +#КонецОбласти // ТекущееОкружение + #Область СериализацияXML // См. пбп_ОбщегоНазначенияСервер.ЗначениеВСтрокуXML. diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" index d543afe8..13e2bb18 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Ext/Module.bsl" @@ -107,10 +107,6 @@ #КонецОбласти -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - #Область МетодыАналогиБСП // Аналог метода БСП. @@ -143,8 +139,52 @@ КонецФункции +#Область ЗапускВнешнихПриложений + +// Аналог метода БСП. Параметры: +// КомандаЗапуска - Строка +// +// Возвращаемое значение: +// Строка +// +Функция БезопаснаяСтрокаКоманды(КомандаЗапуска) Экспорт + + Результат = ""; + + Если ТипЗнч(КомандаЗапуска) = Тип("Строка") Тогда + + ПроверитьСодержитНебезопасныеДействия(КомандаЗапуска); + Результат = КомандаЗапуска; + + ИначеЕсли ТипЗнч(КомандаЗапуска) = Тип("Массив") Тогда + + Если КомандаЗапуска.Количество() > 0 Тогда + ПроверитьСодержитНебезопасныеДействия(КомандаЗапуска[0]); + Результат = МассивВСтрокуКоманды(КомандаЗапуска); + Иначе + ВызватьИсключение пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ожидалось, что первый элемент массива %1 будет командой или путем к исполняемому файлу.'"), + "КомандаЗапуска"); + КонецЕсли; + + Иначе + ВызватьИсключение пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ожидалось, что значение %1 будет типа %2 или %3.'"), + "КомандаЗапуска", "Строка", "Массив"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#КонецОбласти // МетодыАналогиБСП + #КонецОбласти +#Область СлужебныеПроцедурыИФункции + Функция ПолучитьМодуль() #Если Клиент Тогда @@ -159,4 +199,114 @@ КонецФункции +#Область МетодыАналогиБСП + +#Если Не ВебКлиент И Не МобильныйКлиент Тогда + +Функция СтрокаЗапускаКомандыWindows(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодировкаИсполнения) Экспорт + + НаборКоманд = ""; + + Если ЗначениеЗаполнено(КодировкаИсполнения) Тогда + + Если КодировкаИсполнения = "OEM" Тогда + КодировкаИсполнения = 437; + ИначеЕсли КодировкаИсполнения = "CP866" Тогда + КодировкаИсполнения = 866; + ИначеЕсли КодировкаИсполнения = "UTF8" Тогда + КодировкаИсполнения = 65001; + КонецЕсли; + + НаборКоманд = "(chcp " + Формат(КодировкаИсполнения, "ЧГ=") + ")"; + КонецЕсли; + + Если Не ПустаяСтрока(ТекущийКаталог) Тогда + НаборКоманд = НаборКоманд + ?(ЗначениеЗаполнено(НаборКоманд), "&&", "") + "(cd /D """ + ТекущийКаталог + """)"; + КонецЕсли; + НаборКоманд = НаборКоманд + ?(ЗначениеЗаполнено(НаборКоманд), "&&", "") + "(" + СокрЛП(СтрокаКоманды) + ")"; + + Возврат "cmd /S /C """ + НаборКоманд + """"; + +КонецФункции + +#КонецЕсли + +#Область БезопаснаяСтрокаКоманды + +Функция СодержитНебезопасныеДействия(Знач СтрокаКоманды) + + Возврат СтрНайти(СтрокаКоманды, "${") <> 0 + Или СтрНайти(СтрокаКоманды, "$(") <> 0 + Или СтрНайти(СтрокаКоманды, "`") <> 0 + Или СтрНайти(СтрокаКоманды, "|") <> 0 + Или СтрНайти(СтрокаКоманды, ";") <> 0 + Или СтрНайти(СтрокаКоманды, "&") <> 0; + +КонецФункции + +Процедура ПроверитьСодержитНебезопасныеДействия(Знач КомандаЗапуска) + Если СодержитНебезопасныеДействия(КомандаЗапуска) Тогда + ВызватьИсключение пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось запустить программу. + |Недопустимая строка команды + |%1 + | + |Строка команды не должна содержать символы: ""${"", ""$("", ""`"", ""|"", "";"", ""&"".'"), + КомандаЗапуска); + КонецЕсли; +КонецПроцедуры + +Функция МассивВСтрокуКоманды(КомандаЗапуска) + + Результат = Новый Массив; + НужныКавычки = Ложь; + Для Каждого Аргумент Из КомандаЗапуска Цикл + + Если Результат.Количество() > 0 Тогда + Результат.Добавить(" "); + КонецЕсли; + + НужныКавычки = Аргумент = Неопределено + Или ПустаяСтрока(Аргумент) + Или СтрНайти(Аргумент, " ") + Или СтрНайти(Аргумент, Символы.Таб) + Или СтрНайти(Аргумент, "&") + Или СтрНайти(Аргумент, "(") + Или СтрНайти(Аргумент, ")") + Или СтрНайти(Аргумент, "[") + Или СтрНайти(Аргумент, "]") + Или СтрНайти(Аргумент, "{") + Или СтрНайти(Аргумент, "}") + Или СтрНайти(Аргумент, "^") + Или СтрНайти(Аргумент, "=") + Или СтрНайти(Аргумент, ";") + Или СтрНайти(Аргумент, "!") + Или СтрНайти(Аргумент, "'") + Или СтрНайти(Аргумент, "+") + Или СтрНайти(Аргумент, ",") + Или СтрНайти(Аргумент, "`") + Или СтрНайти(Аргумент, "~") + Или СтрНайти(Аргумент, "$") + Или СтрНайти(Аргумент, "|"); + + Если НужныКавычки Тогда + Результат.Добавить(""""); + КонецЕсли; + + Результат.Добавить(СтрЗаменить(Аргумент, """", """""")); + + Если НужныКавычки Тогда + Результат.Добавить(""""); + КонецЕсли; + + КонецЦикла; + + Возврат СтрСоединить(Результат); + +КонецФункции + +#КонецОбласти // БезопаснаяСтрокаКоманды + +#КонецОбласти // МетодыАналогиБСП + #КонецОбласти diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" index 0270671d..cb9061ce 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" @@ -37,4 +37,45 @@ КонецФункции -#КонецОбласти \ No newline at end of file +// Аналог метода БСП. Возвращает соответствие имен "функциональных" подсистем и значения Истина. +// У "функциональной" подсистемы снят флажок "Включать в командный интерфейс". +// +// Возвращаемое значение: +// ФиксированноеСоответствие из КлючИЗначение: +// * Ключ - Строка +// * Значение - Булево +// +Функция ИменаПодсистем() Экспорт + + Имена = Новый Соответствие; + ВставитьИменаПодчиненныхПодсистем(Имена, Метаданные); + + Возврат Новый ФиксированноеСоответствие(Имена); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ВставитьИменаПодчиненныхПодсистем(Имена, РодительскаяПодсистема, ИмяРодительскойПодсистемы = "") + + Для Каждого ТекущаяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл + + Если ТекущаяПодсистема.ВключатьВКомандныйИнтерфейс Тогда + Продолжить; + КонецЕсли; + + ИмяТекущейПодсистемы = ИмяРодительскойПодсистемы + ТекущаяПодсистема.Имя; + Имена.Вставить(ИмяТекущейПодсистемы, Истина); + + Если ТекущаяПодсистема.Подсистемы.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ВставитьИменаПодчиненныхПодсистем(Имена, ТекущаяПодсистема, ИмяТекущейПодсистемы + "."); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти // СлужебныеПроцедурыИФункции \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" index 7aafb82f..10aab2cf 100644 --- "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\321\213\320\265\320\237\320\276\320\264\321\201\320\270\321\201\321\202\320\265\320\274\321\213\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Ext/Module.bsl" @@ -30,6 +30,14 @@ КонецФункции +// См. пбп_СтандартныеПодсистемыПовтИсп.ИменаПодсистем. +Функция ИменаПодсистем() Экспорт + + Модуль = ПолучитьМодуль(); + Возврат Модуль.ИменаПодсистем(); + +КонецФункции + #КонецОбласти #КонецОбласти diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260.xml" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260.xml" new file mode 100644 index 00000000..4759a1e9 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260.xml" @@ -0,0 +1,23 @@ + + + + + пбп_ФайловаяСистема + + + ru + Файловая система + + + + false + false + true + true + true + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260/Ext/Module.bsl" new file mode 100644 index 00000000..99da6443 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260/Ext/Module.bsl" @@ -0,0 +1,355 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 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 в %2: + |Файл не является временным ""%3"".'"), + "Путь", "ФайловаяСистема.УдалитьВременныйФайл", Путь); + КонецЕсли; + + УдалитьВременныеФайлы(Путь); + +КонецПроцедуры + +#Область ЗапускВнешнихПриложений + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для работы с внешними приложениями. + +// Аналог метода БСП. Конструктор параметров для ФайловаяСистема.ЗапуститьПрограмму. +// +// Возвращаемое значение: +// Структура: +// * ТекущийКаталог - Строка - задает текущий каталог запускаемого приложения. +// * ДождатьсяЗавершения - Булево - Ложь - дожидаться завершения запущенного приложения +// перед продолжением работы. +// * ПолучитьПотокВывода - Булево - Ложь - результат, направленный в поток stdout, +// если не указан ДождатьсяЗавершения - игнорируется. +// * ПолучитьПотокОшибок - Булево - Ложь - ошибки, направленные в поток stderr, +// если не указан ДождатьсяЗавершения - игнорируется. +// * КодировкаПотоков - КодировкаТекста +// - Строка - кодировка, используемая для чтения stdout и stderr. +// По умолчанию используется для Windows "CP866", для остальных - "UTF-8". +// * КодировкаИсполнения - Строка +// - Число - кодировка, устанавливаемая в Windows с помощью команды chcp, +// возможные значения: "OEM", "CP866", "UTF8" или номер кодовой страницы. +// В Linux устанавливается переменной окружения "LANGUAGE" для конкретной команды, +// возможные значения можно определить выполнив команду "locale -a", например "ru_RU.UTF-8". +// В MacOS игнорируется. +// +Функция ПараметрыЗапускаПрограммы() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("ТекущийКаталог", ""); + Параметры.Вставить("ДождатьсяЗавершения", Ложь); + Параметры.Вставить("ПолучитьПотокВывода", Ложь); + Параметры.Вставить("ПолучитьПотокОшибок", Ложь); + Параметры.Вставить("КодировкаПотоков", Неопределено); + Параметры.Вставить("КодировкаИсполнения", Неопределено); + + Возврат Параметры; + +КонецФункции + +// Запускает внешнюю программу на исполнение (например, *.exe, *bat), +// или системную команду (например, ping, tracert или traceroute, обращаться к rac-клиенту), +// Позволяет также получать код возврата и значения потоков вывода (stdout) и ошибок (stderr) +// +// При запуске внешней программы в пакетном режиме поток вывода и поток ошибок может возвращаться на не ожидаемом языке. +// Для того чтобы передать внешней программе язык, на котором ожидается результат следует: +// - указать язык в параметре запуска этой программы (если такой параметр предусмотрен). +// Например, в пакетном режиме платформы 1С:Предприятие предусмотрен ключ "/L en"; +// - в других случаях явно установить кодировку исполнения пакетной команды. +// См. свойство КодировкаИсполнения возвращаемого значения ФайловаяСистема.ПараметрыЗапускаПрограммы. +// +// Параметры: +// КомандаЗапуска - Строка - командная строка для запуска программы. +// - Массив - первый элемент массива, путь к исполняемому приложению, +// остальные элементы массива - это передаваемые параметры, +// массив соответствует тому, который получит вызываемая программа в argv. +// ПараметрыЗапускаПрограммы - см. ФайловаяСистема.ПараметрыЗапускаПрограммы +// +// Возвращаемое значение: +// Структура: +// * КодВозврата - Число - код возврата программы; +// * ПотокВывода - Строка - результат работы программы, направленный в поток stdout; +// * ПотокОшибок - Строка - ошибки исполнения программы, направленные в поток stderr. +// +// Пример: +// // Простой запуск +// ФайловаяСистема.ЗапуститьПрограмму("calc"); +// +// // Запуск с ожиданием завершения +// ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы(); +// ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина; +// ФайловаяСистема.ЗапуститьПрограмму("C:\Program Files\1cv8\common\1cestart.exe", +// ПараметрыЗапускаПрограммы); +// +// // Запуск с ожиданием завершения и получением потока вывода +// ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы(); +// ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина; +// ПараметрыЗапускаПрограммы.ПолучитьПотокВывода = Истина; +// Результат = ФайловаяСистема("ping 127.0.0.1 -n 5", ПараметрыЗапускаПрограммы); +// ОбщегоНазначений.СообщитьПользователю(Результат.ПотокВывода); +// +// // Запуск с ожиданием завершения и получением потока вывода и с конкатенацией команды запуска +// ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы(); +// ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина; +// ПараметрыЗапускаПрограммы.ПолучитьПотокВывода = Истина; +// КомандаЗапуска = Новый Массив; +// КомандаЗапуска.Добавить("ping"); +// КомандаЗапуска.Добавить("127.0.0.1"); +// КомандаЗапуска.Добавить("-n"); +// КомандаЗапуска.Добавить(5); +// Результат = ФайловаяСистема.ЗапуститьПрограмму(КомандаЗапуска, ПараметрыЗапускаПрограммы); +// ОбщегоНазначений.СообщитьПользователю(Результат.ПотокВывода); +// +Функция ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт + + // АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией + + СтрокаКоманды = пбп_ОбщегоНазначенияСлужебныйКлиентСервер.БезопаснаяСтрокаКоманды(КомандаЗапуска); + + Если ПараметрыЗапускаПрограммы = Неопределено Тогда + ПараметрыЗапускаПрограммы = ПараметрыЗапускаПрограммы(); + КонецЕсли; + + ТекущийКаталог = ПараметрыЗапускаПрограммы.ТекущийКаталог; + ДождатьсяЗавершения = ПараметрыЗапускаПрограммы.ДождатьсяЗавершения; + ПолучитьПотокВывода = ПараметрыЗапускаПрограммы.ПолучитьПотокВывода; + ПолучитьПотокОшибок = ПараметрыЗапускаПрограммы.ПолучитьПотокОшибок; + КодировкаПотоков = ПараметрыЗапускаПрограммы.КодировкаПотоков; + КодировкаИсполнения = ПараметрыЗапускаПрограммы.КодировкаИсполнения; + + ПроверитьТекущийКаталог(СтрокаКоманды, ТекущийКаталог); + + Если ДождатьсяЗавершения Тогда + Если ПолучитьПотокВывода Тогда + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаПотокаВывода = ПолучитьИмяВременногоФайла("stdout.tmp"); + // BSLLS:MissingTemporaryFileDeletion-on + СтрокаКоманды = СтрокаКоманды + " > """ + ИмяФайлаПотокаВывода + """"; + КонецЕсли; + + Если ПолучитьПотокОшибок Тогда + // BSLLS:MissingTemporaryFileDeletion-off + ИмяФайлаПотокаОшибок = ПолучитьИмяВременногоФайла("stderr.tmp"); + // BSLLS:MissingTemporaryFileDeletion-on + СтрокаКоманды = СтрокаКоманды + " 2>""" + ИмяФайлаПотокаОшибок + """"; + КонецЕсли; + КонецЕсли; + + Если КодировкаПотоков = Неопределено Тогда + КодировкаПотоков = КодировкаСтандартныхПотоков(); + КонецЕсли; + + // Для cmd не всегда активна текущая кодовая страница, поэтому всегда задаем по-умолчанию. + Если КодировкаИсполнения = Неопределено И пбп_ОбщегоНазначенияСлужебный.ЭтоWindowsСервер() Тогда + КодировкаИсполнения = "CP866"; + КонецЕсли; + + КодВозврата = Неопределено; + + Если пбп_ОбщегоНазначенияСлужебный.ЭтоWindowsСервер() Тогда + + СтрокаКоманды = пбп_ОбщегоНазначенияСлужебныйКлиентСервер.СтрокаЗапускаКомандыWindows( + СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодировкаИсполнения); + + Если пбп_ОбщегоНазначенияСлужебный.ИнформационнаяБазаФайловая() Тогда + // В файловой информационной базе показывать окно консоли не следует и в серверном контексте. + Оболочка = Новый COMОбъект("Wscript.Shell"); + КодВозврата = Оболочка.Run(СтрокаКоманды, 0, ДождатьсяЗавершения); + Оболочка = Неопределено; + Иначе + // BSLLS:ExternalAppStarting-off + ЗапуститьПриложение(СтрокаКоманды, , ДождатьсяЗавершения, КодВозврата); + // BSLLS:ExternalAppStarting-on + КонецЕсли; + + Иначе + + Если пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер() И ЗначениеЗаполнено(КодировкаИсполнения) Тогда + СтрокаКоманды = "LANGUAGE=" + КодировкаИсполнения + " " + СтрокаКоманды; + КонецЕсли; + + // BSLLS:ExternalAppStarting-off + ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата); + // BSLLS:ExternalAppStarting-on + КонецЕсли; + + ПотокВывода = ""; + ПотокОшибок = ""; + + Если ДождатьсяЗавершения Тогда + Если ПолучитьПотокВывода Тогда + ПотокВывода = ПрочитатьФайлЕслиСуществует(ИмяФайлаПотокаВывода, КодировкаПотоков); + УдалитьВременныйФайл(ИмяФайлаПотокаВывода); + КонецЕсли; + + Если ПолучитьПотокОшибок Тогда + ПотокОшибок = ПрочитатьФайлЕслиСуществует(ИмяФайлаПотокаОшибок, КодировкаПотоков); + УдалитьВременныйФайл(ИмяФайлаПотокаОшибок); + КонецЕсли; + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("КодВозврата", КодВозврата); + Результат.Вставить("ПотокВывода", ПотокВывода); + Результат.Вставить("ПотокОшибок", ПотокОшибок); + + Возврат Результат; + + // АПК:534-вкл + +КонецФункции + +#КонецОбласти + +#КонецОбласти // МетодыАналогиБСП + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Аналог метода БСП. +Процедура УдалитьВременныеФайлы(Знач Путь) + + Попытка + УдалитьФайлы(Путь); + Исключение + пбп_ЖурналРегистрацииСлужебный.ДобавитьСообщениеДляЖурналаРегистрации( + НСтр("ru = 'Стандартные подсистемы'", пбп_ОбщегоНазначенияСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , + пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось удалить временный файл ""%1"" по причине: + |%2'"), + Путь, + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + КонецПопытки; + +КонецПроцедуры + +// Аналог метода БСП. +Функция ЭтоИмяВременногоФайла(Путь) + + // Ожидается, что Путь получен методом ПолучитьИмяВременногоФайла(). + // Перед проверкой разворачиваем слэши в одну сторону. + Возврат СтрНачинаетсяС(СтрЗаменить(Путь, "/", "\"), СтрЗаменить(КаталогВременныхФайлов(), "/", "\")); + +КонецФункции + +#Область ЗапуститьПрограмму + +// Аналог метода БСП. +Процедура ПроверитьТекущийКаталог(СтрокаКоманды, ТекущийКаталог) + + Если Не ПустаяСтрока(ТекущийКаталог) Тогда + + ФайлИнфо = Новый Файл(ТекущийКаталог); + + Если Не ФайлИнфо.Существует() Тогда + ВызватьИсключение пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось запустить программу + |%1 + |по причине: + |Не существует каталог %2 + |%3'"), + СтрокаКоманды, "ТекущийКаталог", ТекущийКаталог); + КонецЕсли; + + Если Не ФайлИнфо.ЭтоКаталог() Тогда + ВызватьИсключение пбп_СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось запустить программу + |%1 + |по причине: + |%2 не является каталогом + |%3'"), + СтрокаКоманды, "ТекущийКаталог", ТекущийКаталог); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Аналог метода БСП. +Функция ПрочитатьФайлЕслиСуществует(Путь, Кодировка) + + Результат = Неопределено; + ФайлИнфо = Новый Файл(Путь); + + Если ФайлИнфо.Существует() Тогда + + ЧтениеПотокаОшибок = Новый ЧтениеТекста(Путь, Кодировка); + Результат = ЧтениеПотокаОшибок.Прочитать(); + ЧтениеПотокаОшибок.Закрыть(); + + КонецЕсли; + + Если Результат = Неопределено Тогда + Результат = ""; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// // Аналог метода БСП. Возвращает кодировку стандартных поток вывода и ошибок, используемую в текущей ОС. +// +// Возвращаемое значение: +// КодировкаТекста +// +Функция КодировкаСтандартныхПотоков() + + Если пбп_ОбщегоНазначенияСлужебный.ЭтоWindowsСервер() Тогда + Кодировка = "CP866"; + Иначе + Кодировка = "UTF-8"; + КонецЕсли; + + Возврат Кодировка; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217.xml" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217.xml" new file mode 100644 index 00000000..67f89ebd --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217.xml" @@ -0,0 +1,23 @@ + + + + + пбп_ФайловаяСистемаПереадресация + + + ru + Файловая система переадресация + + + + false + false + true + true + false + false + false + DontUse + + + \ No newline at end of file diff --git "a/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" new file mode 100644 index 00000000..af7da006 --- /dev/null +++ "b/src/cf/CommonModules/\320\277\320\261\320\277_\320\244\320\260\320\271\320\273\320\276\320\262\320\260\321\217\320\241\320\270\321\201\321\202\320\265\320\274\320\260\320\237\320\265\321\200\320\265\320\260\320\264\321\200\320\265\321\201\320\260\321\206\320\270\321\217/Ext/Module.bsl" @@ -0,0 +1,57 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 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/ +// + +#Область СлужебныйПрограммныйИнтерфейс + +// См. пбп_ФайловаяСистема.УдалитьВременныйФайл. +Процедура УдалитьВременныйФайл(Знач Путь) Экспорт + + Модуль = ПолучитьМодуль(); + Модуль.УдалитьВременныйФайл(Путь); + +КонецПроцедуры + +// См. пбп_ФайловаяСистема.ПараметрыЗапускаПрограммы. +Процедура ПараметрыЗапускаПрограммы() Экспорт + + Модуль = ПолучитьМодуль(); + Модуль.ПараметрыЗапускаПрограммы(); + +КонецПроцедуры + +// См. пбп_ФайловаяСистема.ЗапуститьПрограмму. +Процедура ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт + + Модуль = ПолучитьМодуль(); + // BSLLS:ExternalAppStarting-off + Модуль.ЗапуститьПрограмму(КомандаЗапуска, ПараметрыЗапускаПрограммы); + // BSLLS:ExternalAppStarting-on + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьМодуль() + Возврат пбп_ОбщегоНазначенияПовтИсп.ПереадресацияОбщегоМодуля("ФайловаяСистема", "пбп_ФайловаяСистема"); +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/src/cf/Configuration.xml b/src/cf/Configuration.xml index ba279dfe..fa8924ac 100644 --- a/src/cf/Configuration.xml +++ b/src/cf/Configuration.xml @@ -57,7 +57,7 @@ Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок Первый БИТ - 1.0.2.5 + 1.0.2.6 false false @@ -318,6 +318,8 @@ пбп_СтроковыеФункцииКлиентСервер пбп_СтроковыеФункцииСлужебныйКлиентСервер пбп_СхемыЗапросов + пбп_ФайловаяСистема + пбп_ФайловаяСистемаПереадресация пбп_ДокументыОбработкаЗаполнения пбп_ДокументыОбработкаПроведения пбп_ДокументыОбработкаПроверкиЗаполнения diff --git "a/src/cf/Subsystems/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217.xml" "b/src/cf/Subsystems/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217.xml" index ed17afc9..bcee565d 100644 --- "a/src/cf/Subsystems/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217.xml" +++ "b/src/cf/Subsystems/\320\277\320\261\320\277_\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217.xml" @@ -56,6 +56,8 @@ CommonModule.пбп_СхемыЗапросов DefinedType.пбп_Пользователи DefinedType.пбп_УчетныеЗаписиЭлектроннойПочты + CommonModule.пбп_ФайловаяСистема + CommonModule.пбп_ФайловаяСистемаПереадресация