1
0
mirror of https://github.com/firstBitSportivnaya/PSSL.git synced 2024-11-21 17:56:47 +02:00

Add functions for sftp linux (#113)

Добавлены функции для работы с SFTP на ОС Linux с помощью командной строки и утилит: curl, sshpass, expect
This commit is contained in:
Permichev Vladislav 2024-10-01 19:30:10 +03:00 committed by GitHub
parent 38c9027ad0
commit b4b7c46a64
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 1836 additions and 14 deletions

View File

@ -174,12 +174,21 @@
ЭлементНаследования = Справочники.пбп_ТипыИнтеграций
.ПолучитьПредопределенныйЭлементНаследованияНастроекТипаИнтеграции(РеквизитыОбъекта.ТипИнтеграции);
Если ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.Каталог
Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.FTPРесурсы
Или ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.ПочтовыйКлиент Тогда
УстановитьВидимостьЭлементовДляТипаФайловыеОбмены();
пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы, "ПользовательскаяФункция", УстанавливаемоеСвойство,
Элементы, ПользовательскаяФункция, УстанавливаемоеСвойство,
РеквизитыОбъекта.ИспользоватьПользовательскиеФункции);
ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.FTPРесурсы Тогда
Элементы.ТочкаВхода.Заголовок = НСтр("ru = 'Путь к каталогу на сервере'");
пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы, "ТочкаВхода", УстанавливаемоеСвойство, Истина);
пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы, "ПараметрыВхода", УстанавливаемоеСвойство, Ложь);
пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы, ПользовательскаяФункция, УстанавливаемоеСвойство,
РеквизитыОбъекта.ИспользоватьПользовательскиеФункции);
ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.COM Тогда
Элементы.ТочкаВхода.Заголовок = НСтр("ru = 'Функция / запрос'");

View File

@ -278,7 +278,7 @@
пбп_ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
Элементы, СписокНастроекСтрока, УстанавливаемоеСвойство, Ложь);
ИначеЕсли ЭлементНаследования = Справочники.пбп_ТипыИнтеграций.FTPРесурсы Тогда
Элементы.СтрокаПодключения.Заголовок = НСтр("ru = 'Путь к каталогу'");
Элементы.СтрокаПодключения.Заголовок = НСтр("ru = 'Адрес сервера'");
УстановитьВидимостьЭлементовДляТипаФайловыеОбмены();

View File

@ -74,7 +74,7 @@
Процедура ПриДобавленииПодсистемы(Описание) Экспорт
Описание.Имя = "ПроектнаяБиблиотекаПодсистем";
Описание.Версия = "1.0.2.5";
Описание.Версия = "1.0.2.6";
// Требуется библиотека стандартных подсистем.
Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы");

View File

@ -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;
КонецФункции
#КонецОбласти // ТекущееОкружение
#Область Прочее
// Аналог метода БСП. Пока заглушка, см. ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания
Процедура ПриНачалеВыполненияРегламентногоЗадания(РегламентноеЗадание = Неопределено) Экспорт
КонецПроцедуры
#КонецОбласти // Прочее
#КонецОбласти
#Область ПользовательскиеФункции

View File

@ -128,6 +128,34 @@
КонецФункции
// См. пбп_ОбщегоНазначенияСервер.ИнформационнаяБазаФайловая.
Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт
Модуль = ПолучитьМодуль();
Возврат Модуль.ИнформационнаяБазаФайловая(СтрокаСоединенияИнформационнойБазы);
КонецФункции
#Область ТекущееОкружение
// См. пбп_ОбщегоНазначенияСервер.ЭтоWindowsСервер.
Функция ЭтоWindowsСервер() Экспорт
Модуль = ПолучитьМодуль();
Возврат Модуль.ЭтоWindowsСервер();
КонецФункции
// См. пбп_ОбщегоНазначенияСервер.ЭтоLinuxСервер.
Функция ЭтоLinuxСервер() Экспорт
Модуль = ПолучитьМодуль();
Возврат Модуль.ЭтоLinuxСервер();
КонецФункции
#КонецОбласти // ТекущееОкружение
#Область СериализацияXML
// См. пбп_ОбщегоНазначенияСервер.ЗначениеВСтрокуXML.

View File

@ -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 Тогда
Результат.Добавить(" ");
КонецЕсли;
НужныКавычки = Аргумент = Неопределено
Или ПустаяСтрока(Аргумент)
Или СтрНайти(Аргумент, " ")
Или СтрНайти(Аргумент, Символы.Таб)
Или СтрНайти(Аргумент, "&")
Или СтрНайти(Аргумент, "(")
Или СтрНайти(Аргумент, ")")
Или СтрНайти(Аргумент, "[")
Или СтрНайти(Аргумент, "]")
Или СтрНайти(Аргумент, "{")
Или СтрНайти(Аргумент, "}")
Или СтрНайти(Аргумент, "^")
Или СтрНайти(Аргумент, "=")
Или СтрНайти(Аргумент, ";")
Или СтрНайти(Аргумент, "!")
Или СтрНайти(Аргумент, "'")
Или СтрНайти(Аргумент, "+")
Или СтрНайти(Аргумент, ",")
Или СтрНайти(Аргумент, "`")
Или СтрНайти(Аргумент, "~")
Или СтрНайти(Аргумент, "$")
Или СтрНайти(Аргумент, "|");
Если НужныКавычки Тогда
Результат.Добавить("""");
КонецЕсли;
Результат.Добавить(СтрЗаменить(Аргумент, """", """"""));
Если НужныКавычки Тогда
Результат.Добавить("""");
КонецЕсли;
КонецЦикла;
Возврат СтрСоединить(Результат);
КонецФункции
#КонецОбласти // БезопаснаяСтрокаКоманды
#КонецОбласти // МетодыАналогиБСП
#КонецОбласти

View File

@ -37,4 +37,45 @@
КонецФункции
#КонецОбласти
// Аналог метода БСП. Возвращает соответствие имен "функциональных" подсистем и значения Истина.
// У "функциональной" подсистемы снят флажок "Включать в командный интерфейс".
//
// Возвращаемое значение:
// ФиксированноеСоответствие из КлючИЗначение:
// * Ключ - Строка
// * Значение - Булево
//
Функция ИменаПодсистем() Экспорт
Имена = Новый Соответствие;
ВставитьИменаПодчиненныхПодсистем(Имена, Метаданные);
Возврат Новый ФиксированноеСоответствие(Имена);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ВставитьИменаПодчиненныхПодсистем(Имена, РодительскаяПодсистема, ИмяРодительскойПодсистемы = "")
Для Каждого ТекущаяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл
Если ТекущаяПодсистема.ВключатьВКомандныйИнтерфейс Тогда
Продолжить;
КонецЕсли;
ИмяТекущейПодсистемы = ИмяРодительскойПодсистемы + ТекущаяПодсистема.Имя;
Имена.Вставить(ИмяТекущейПодсистемы, Истина);
Если ТекущаяПодсистема.Подсистемы.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ВставитьИменаПодчиненныхПодсистем(Имена, ТекущаяПодсистема, ИмяТекущейПодсистемы + ".");
КонецЦикла;
КонецПроцедуры
#КонецОбласти // СлужебныеПроцедурыИФункции

View File

@ -30,6 +30,14 @@
КонецФункции
// См. пбп_СтандартныеПодсистемыПовтИсп.ИменаПодсистем.
Функция ИменаПодсистем() Экспорт
Модуль = ПолучитьМодуль();
Возврат Модуль.ИменаПодсистем();
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.16">
<CommonModule uuid="c1c50d3e-2a6a-46c5-bbf5-41918e2ad5bd">
<Properties>
<Name>пбп_ФайловаяСистема</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Файловая система</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>true</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>

View File

@ -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";
КонецЕсли;
Возврат Кодировка;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.16">
<CommonModule uuid="403f9103-b5f2-4022-9064-8ff8ebd8e1c8">
<Properties>
<Name>пбп_ФайловаяСистемаПереадресация</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Файловая система переадресация</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>

View File

@ -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
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПолучитьМодуль()
Возврат пбп_ОбщегоНазначенияПовтИсп.ПереадресацияОбщегоМодуля("ФайловаяСистема", "пбп_ФайловаяСистема");
КонецФункции
#КонецОбласти

View File

@ -57,7 +57,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок</xr:Item>
</DefaultRoles>
<Vendor>Первый БИТ</Vendor>
<Version>1.0.2.5</Version>
<Version>1.0.2.6</Version>
<UpdateCatalogAddress/>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UseManagedFormInOrdinaryApplication>false</UseManagedFormInOrdinaryApplication>
@ -318,6 +318,8 @@
<CommonModule>пбп_СтроковыеФункцииКлиентСервер</CommonModule>
<CommonModule>пбп_СтроковыеФункцииСлужебныйКлиентСервер</CommonModule>
<CommonModule>пбп_СхемыЗапросов</CommonModule>
<CommonModule>пбп_ФайловаяСистема</CommonModule>
<CommonModule>пбп_ФайловаяСистемаПереадресация</CommonModule>
<EventSubscription>пбп_ДокументыОбработкаЗаполнения</EventSubscription>
<EventSubscription>пбп_ДокументыОбработкаПроведения</EventSubscription>
<EventSubscription>пбп_ДокументыОбработкаПроверкиЗаполнения</EventSubscription>

View File

@ -56,6 +56,8 @@
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.пбп_СхемыЗапросов</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">DefinedType.пбп_Пользователи</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">DefinedType.пбп_УчетныеЗаписиЭлектроннойПочты</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.пбп_ФайловаяСистема</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">CommonModule.пбп_ФайловаяСистемаПереадресация</xr:Item>
</Content>
</Properties>
<ChildObjects/>