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 afeef3ce..c6481a36 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" @@ -619,7 +619,7 @@ СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); КонецЕсли; - УдалитьФайлы(НовыйФайл); + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(НовыйФайл); Исключение ПолноеОписаниеОшибки = СтрШаблон("ru = '%1%2';", ЗаголовокОшибки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); @@ -1023,15 +1023,18 @@ ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; КонецЕсли; - ЗапуститьПриложение(ИтоговаяКоманда, , Истина, КодВозврата); + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; - УдалитьФайлы(ИмяФайлаСкрипта); + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); + + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяФайлаСкрипта); Если ЭтоExpect Тогда - УдалитьФайлы(ИмяСлужебногоФайла); + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяСлужебногоФайла); КонецЕсли; - Если КодВозврата <> 0 Тогда + Если Результат.КодВозврата <> 0 Тогда ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, "не удалось выполнить команду системы, код возврата", КодВозврата); СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); @@ -1204,11 +1207,14 @@ ИтоговаяКоманда = """" + ИмяФайлаСкрипта + """"; КонецЕсли; - ЗапуститьПриложение(ИтоговаяКоманда, , Истина, КодВозврата); + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(ИтоговаяКоманда, ПараметрыЗапускаКоманды); - УдалитьФайлы(ИмяФайлаСкрипта); + пбп_ФайловаяСистемаПереадресация.УдалитьВременныйФайл(ИмяФайлаСкрипта); - Если КодВозврата <> 0 Тогда + Если Результат.КодВозврата <> 0 Тогда ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2 - %3';", ЗаголовокОшибки, "не удалось выполнить команду системы, код возврата", КодВозврата); СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); @@ -1285,7 +1291,7 @@ ТекстСкрипта = ПолучитьТекстСкриптаОтправкиДляCurl(ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); Иначе - ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляExpect(ПараметрыСоединения, + ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляCurl(ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); КонецЕсли; ИначеЕсли ИмяУстановленнойУтилиты = ИмяУтилитыSshpass Тогда @@ -1296,7 +1302,7 @@ ТекстСкрипта = ПолучитьТекстСкриптаОтправкиДляSshpass(ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); Иначе - ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляExpect(ПараметрыСоединения, + ТекстСкрипта = ПолучитьТекстСкриптаПолученияДляSshpass(ПараметрыСоединения, ПутьЛокальногоФайла, ПутьФайлаНаСервере); КонецЕсли; ИначеЕсли ИмяУстановленнойУтилиты = ИмяУтилитыExpect Тогда @@ -1325,12 +1331,18 @@ ИмяФайлаПроверки = ПолучитьИмяВременногоФайла("txt"); КомандаПроверки = СтрШаблон("command -v %1 > %2", ИмяУтилиты, ИмяФайлаПроверки); - ЗапуститьПриложение(КомандаПроверки); - ЧтениеФайла = Новый ЧтениеТекста(ИмяФайлаПроверки); - ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); - Если ТекущаяСтрока <> Неопределено Тогда - РезультатПроверки = Истина; + ПараметрыЗапускаКоманды = пбп_ФайловаяСистемаПереадресация.ПараметрыЗапускаПрограммы(); + ПараметрыЗапускаКоманды.ДождатьсяЗавершения = Истина; + + Результат = пбп_ФайловаяСистемаПереадресация.ЗапуститьПрограмму(КомандаПроверки, ПараметрыЗапускаКоманды); + + Если Результат.КодВозврата = 0 Тогда + ЧтениеФайла = Новый ЧтениеТекста(ИмяФайлаПроверки); + ТекущаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); + Если ТекущаяСтрока <> Неопределено Тогда + РезультатПроверки = Истина; + КонецЕсли; КонецЕсли; Возврат РезультатПроверки; 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 6701b092..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,25 @@ #Область МетодыАналогиБСП +// Аналог метода БСП. Определяет режим эксплуатации информационной базы файловый (Истина) или серверный (Ложь). +// При проверке используется СтрокаСоединенияИнформационнойБазы, которую можно указать явно. +// +// Параметры: +// СтрокаСоединенияИнформационнойБазы - Строка - параметр используется, если +// нужно проверить строку соединения не текущей информационной базы. +// +// Возвращаемое значение: +// Булево - Истина, если файловая. +// +Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт + + Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда + СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы(); + КонецЕсли; + Возврат СтрНайти(ВРег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1; + +КонецФункции + // Аналог метода БСП. Возвращает Истина, если функциональная подсистема существует в конфигурации. // Предназначена для реализации вызова необязательной подсистемы (условного вызова). // У функциональной подсистемы снят флажок "Включать в командный интерфейс". 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 e30ffa06..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,14 @@ КонецФункции +// См. пбп_ОбщегоНазначенияСервер.ИнформационнаяБазаФайловая. +Функция ИнформационнаяБазаФайловая(Знач СтрокаСоединенияИнформационнойБазы = "") Экспорт + + Модуль = ПолучитьМодуль(); + Возврат Модуль.ИнформационнаяБазаФайловая(СтрокаСоединенияИнформационнойБазы); + +КонецФункции + #Область ТекущееОкружение // См. пбп_ОбщегоНазначенияСервер.ЭтоWindowsСервер. 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..c0c8bb22 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\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..520c5cda --- /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,347 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 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-выкл методы безопасного запуска обеспечиваются этой функцией + + СтрокаКоманды = пбп_ОбщегоНазначенияСлужебныйКлиентСервер.БезопаснаяСтрокаКоманды(КомандаЗапуска); + + Если ПараметрыЗапускаПрограммы = Неопределено Тогда + ПараметрыЗапускаПрограммы = ПараметрыЗапускаПрограммы(); + КонецЕсли; + + ТекущийКаталог = ПараметрыЗапускаПрограммы.ТекущийКаталог; + ДождатьсяЗавершения = ПараметрыЗапускаПрограммы.ДождатьсяЗавершения; + ПолучитьПотокВывода = ПараметрыЗапускаПрограммы.ПолучитьПотокВывода; + ПолучитьПотокОшибок = ПараметрыЗапускаПрограммы.ПолучитьПотокОшибок; + КодировкаПотоков = ПараметрыЗапускаПрограммы.КодировкаПотоков; + КодировкаИсполнения = ПараметрыЗапускаПрограммы.КодировкаИсполнения; + + ПроверитьТекущийКаталог(СтрокаКоманды, ТекущийКаталог); + + Если ДождатьсяЗавершения Тогда + Если ПолучитьПотокВывода Тогда + ИмяФайлаПотокаВывода = ПолучитьИмяВременногоФайла("stdout.tmp"); + СтрокаКоманды = СтрокаКоманды + " > """ + ИмяФайлаПотокаВывода + """"; + КонецЕсли; + + Если ПолучитьПотокОшибок Тогда + ИмяФайлаПотокаОшибок = ПолучитьИмяВременногоФайла("stderr.tmp"); + СтрокаКоманды = СтрокаКоманды + " 2>""" + ИмяФайлаПотокаОшибок + """"; + КонецЕсли; + КонецЕсли; + + Если КодировкаПотоков = Неопределено Тогда + КодировкаПотоков = КодировкаСтандартныхПотоков(); + КонецЕсли; + + // Для cmd не всегда активна текущая кодовая страница, поэтому всегда задаем по-умолчанию. + Если КодировкаИсполнения = Неопределено И пбп_ОбщегоНазначенияСлужебный.ЭтоWindowsСервер() Тогда + КодировкаИсполнения = "CP866"; + КонецЕсли; + + КодВозврата = Неопределено; + + Если пбп_ОбщегоНазначенияСлужебный.ЭтоWindowsСервер() Тогда + + СтрокаКоманды = пбп_ОбщегоНазначенияСлужебныйКлиентСервер.СтрокаЗапускаКомандыWindows( + СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодировкаИсполнения); + + Если пбп_ОбщегоНазначенияСлужебный.ИнформационнаяБазаФайловая() Тогда + // В файловой информационной базе показывать окно консоли не следует и в серверном контексте. + Оболочка = Новый COMОбъект("Wscript.Shell"); + КодВозврата = Оболочка.Run(СтрокаКоманды, 0, ДождатьсяЗавершения); + Оболочка = Неопределено; + Иначе + ЗапуститьПриложение(СтрокаКоманды,, ДождатьсяЗавершения, КодВозврата); + КонецЕсли; + + Иначе + + Если пбп_ОбщегоНазначенияСлужебный.ЭтоLinuxСервер() И ЗначениеЗаполнено(КодировкаИсполнения) Тогда + СтрокаКоманды = "LANGUAGE=" + КодировкаИсполнения + " " + СтрокаКоманды; + КонецЕсли; + + ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата); + КонецЕсли; + + ПотокВывода = ""; + ПотокОшибок = ""; + + Если ДождатьсяЗавершения Тогда + Если ПолучитьПотокВывода Тогда + ПотокВывода = ПрочитатьФайлЕслиСуществует(ИмяФайлаПотокаВывода, КодировкаПотоков); + УдалитьВременныйФайл(ИмяФайлаПотокаВывода); + КонецЕсли; + + Если ПолучитьПотокОшибок Тогда + ПотокОшибок = ПрочитатьФайлЕслиСуществует(ИмяФайлаПотокаОшибок, КодировкаПотоков); + УдалитьВременныйФайл(ИмяФайлаПотокаОшибок); + КонецЕсли; + КонецЕсли; + + Результат = Новый Структура; + Результат.Вставить("КодВозврата", КодВозврата); + Результат.Вставить("ПотокВывода", ПотокВывода); + Результат.Вставить("ПотокОшибок", ПотокОшибок); + + Возврат Результат; + + // АПК: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..f691f233 --- /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,55 @@ +// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8, +// включая доработку типовых конфигураций. +// +// Copyright First BIT company +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// URL: https://github.com/firstBitSportivnaya/PSSL/ +// + +#Область СлужебныйПрограммныйИнтерфейс + +// См. пбп_ФайловаяСистема.УдалитьВременныйФайл. +Процедура УдалитьВременныйФайл(Знач Путь) Экспорт + + Модуль = ПолучитьМодуль(); + Модуль.УдалитьВременныйФайл(Путь); + +КонецПроцедуры + +// См. пбп_ФайловаяСистема.ПараметрыЗапускаПрограммы. +Процедура ПараметрыЗапускаПрограммы() Экспорт + + Модуль = ПолучитьМодуль(); + Модуль.ПараметрыЗапускаПрограммы(); + +КонецПроцедуры + +// См. пбп_ФайловаяСистема.ЗапуститьПрограмму. +Процедура ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт + + Модуль = ПолучитьМодуль(); + Модуль.ЗапуститьПрограмму(КомандаЗапуска, ПараметрыЗапускаПрограммы); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПолучитьМодуль() + Возврат пбп_ОбщегоНазначенияПовтИсп.ПереадресацияОбщегоМодуля("ФайловаяСистема", "пбп_ФайловаяСистема"); +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/src/cf/Configuration.xml b/src/cf/Configuration.xml index 594cea23..fa8924ac 100644 --- a/src/cf/Configuration.xml +++ b/src/cf/Configuration.xml @@ -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.пбп_ФайловаяСистемаПереадресация