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.пбп_ФайловаяСистемаПереадресация