Вы запускаете приложения, но делаете это без уважения

Публикация № 1266995

Разработка - Практика программирования

Приложение запуск безопасный код COM shell

О запуске сторонних приложений и скриптов из кода встроенного языка платформы 1С.

Необходимость

Платформа 1С великолепна, замечательна и просто мощная. Обширный функционал доступен из коробки, а технология внешних компонент делает ее практически безграничной в части расширения возможностей. Но иногда...

Иногда все это не помогает и для достижения результатов, решения задачи - приходиться использовать сторонний софт. И ладно, если бы это были COM-объекты, которые хоть и являются устаревшей технологией, но до сих пор часто используются и даже получили некоторую вторую жизнь с последними событиями. Но есть и другой путь - запуск приложений напрямую из кода встроенного языка.

&НаСервере
Процедура ВыполнитьБесконечныйПинг()

	ЗапуститьПриложение("ping 127.0.0.1 -t");
	
КонецПроцедуры

Сегодня мы поговорим о запуске приложений программным способом. А также о некоторых проблемах и способах их решений под Windows и Linux.

Часть подходов, которые будут описаны ниже, применяются в разработке "Командный интерпретатор для 1С", но скачивать ее для изучения не обязательно. Все есть здесь. Там лишь все это организовано в удобном виде для использования.

Исполни это

Причин, когда такое может понадобиться - много, очень много. Все их рассматривать точно не будем. Остановимся на одном простейшем примере - запуск команды ping, чтобы узнать доступность какого-либо ресурса в сети средствами 1С. Иногда еще ping запускают для эмулирования ожидания (метода Sleep), но мы такое извращение делать не будем :)

Наша задача - запустить какое-либо приложение с параметрами и получить результат его работы. И сделать мы это должны безопасным способом!

Последнее означает, что если запускаемое приложение зависнет, запросит интерактивных действий от пользователя (а на сервере мы ничем ему в этом случае помочь не сможем) или просто будет выполняться дольше выделенного для него времени, то мы должны завершить его работу и продолжить выполнение кода в обычном режиме и обработать исключение. Никому ведь не нужны зависшие сеансы 1С?

Мы рассмотрим несколько решений как для Windows, так и для Linux. И так, поехали.

My Little Windows

По классике, сначала мы сделаем плохо, а потом сделаем хорошо. Прежде чем начать дам несколько служебных функций, которые будут использоваться в примерах ниже.

 
 Служебные процедуры и функции

Решения не идеальные, но простые. Например, там можно найти как сохранить файл в кодировке UTF-8 без BOM, получить путь к файлу PowerShell.exe и др. Решения всегда можно улучшать.

Плохой пример

И так, как обычно выполняется запуск приложений из кода встроенного языка? Правильно - с помощью процедуры "ЗапуститьПриложение()":

ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>, <КодВозврата>)

Первым параметром передаем строку команды запуска и параметры по необходимости. Во втором устанавливаем каталог, что не обязательно. Третий параметр позволяет дождаться завершения приложения, а четвертый получить код возврата. Обычно если код возврата не равен 0, значит что-то пошло не так.

Вернемся к нашей задаче. Выполним команду "ping infostart.ru". 

// Временный файл для сохранения вывода результата на консоль
ПутьКФайлуРезультата = ПолучитьИмяВременногоФайла("log");;

// Формируем текст команды для запуска. Здесь может быть произвольный текст команды или даже целый скрипт.
КомандаЗапуска = "ping infostart.ru > ""{ПутьКФайлуРезультата}""";
КомандаЗапуска = СтрЗаменить(КомандаЗапуска, "{ПутьКФайлуРезультата}", ПутьКФайлуРезультата);

// Сохраняем команду запуска в файл исполняемого скрипта BAT.
// Это нужно для обхода различных ограничений работы процедуры "ЗапуститьПриложение",
// которая некоторые команды не может обрабатывать корректно
ФайлСкрипта = ПолучитьИмяВременногоФайла("bat");
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(КомандаЗапуска);
ТекстовыйДокумент.Записать(ФайлСкрипта, "cp866");

// Запускаем сформированный BAT-скрипт на выполнение
КодВозврата = Неопределено;
ЗапуститьПриложение(ФайлСкрипта,, Истина, КодВозврата);

Если КодВозврата = 0 Тогда
	// Если ошибок при выполнении нет, то получаем строку вывода результата
	ТекстовыйДокуменнт = Новый ТекстовыйДокумент;
	ТекстовыйДокуменнт.Прочитать(ПутьКФайлуРезультата, "cp866");
	ТекстРезультат = ТекстовыйДокуменнт.ПолучитьТекст();
Иначе
	// Иначе вызываем исключение
	ВызватьИсключение "Ошибка выполнения команды. Код возврата: " + КодВозврата;
КонецЕсли;

// Удаляем временные файлы
УдалитьФайлЕслиВозможно(ФайлСкрипта);
УдалитьФайлЕслиВозможно(ПутьКФайлуРезультата);

Вариант рабочий и позволяет запускать большую часть команд и целых скриптов. Комментарии даны исчерпывающие. Используются только штатные возможности платформы 1С для выполнения команд. И это плюс. Но у этого подхода есть и большой минус - низкая надежность и непредсказуемость результата в тех случаях, когда точно не известно, как долго будет команда выполняться и не потребует ли приложение интерактивных действий пользователя. Если интерактивные действия потребуются на стороне сервера, где мы об этом даже и не узнаем, то сеанс 1С может подвиснуть на всегда.

В качестве решения может быть реализация таймаута выполнения команды, но для процедуры "ЗапуститьПриложение" такое реализовать практически невозможно. Можно, конечно, попробовать запустить приложение и ожидать файла-результата какое-то время, но это решит проблему частично. Зависания не будет, но приложение будет запущено и дальше, ожидая внешней команды.

WScript.Shell нас спасет

Мы же в среде Windows. Давайте используем ее средства в виде COM-Объекта "WScript.Shell":

 
 Безопасный запуск команды / скрипта через WScript.Shell

Теперь приложение не зависнет и в случае чего мы сможем завершить его работу принудительно.

 Мое имя Power, PowerShell

Пойдем дальше и сделаем наше решение более интересным. Что, если нам нужно запустить не простую команду CMD или BAT'ник, а команду или скрипт PowerShell, но на тех же условиях! Для примера опять же оставим запуск бесконечного пинга :)

 
 Запускаем безопасно скрипты PowerShell

Фактически, теперь можно запускать любые скрипты хоть CMD, хоть PowerShell. А если сильно хочется, то можно и GIT Bash под Windows использовать или даже подсистему WSL под Windows 10. Но все это уже другая история. Осталось поговорить про Linux.

*.nix is my own

Под *.nix привычнее всего использовать bash для выполнения команд. Можно ли использовать bash из встроенного языка платформы 1С? Да, можно. Можно запускать как отдельные команды, так и целые скрипты. При этом получать результат и, что самое главное, делать это безопасно как в примерах выше.

В далеком 2015 году на Mista была поднята тема "Запуск файлов *.sh в самой 1с". Возможно, информация ниже будет ответом на вопрос, т.к. точного ответа так там и нет. Но может быть я не прав :)

 Запускаем bash-скрипты

Первое, что нужно понять - в Linux нет COM-объектов. Значит придется обойтись штатными средствами платформы 1С. Выглядеть это будет так:

// Задаем параметры
ТаймаутВыполненияСек = 10;
ТекстКомандыДляВыполнения = ТекстКоманды;

// Подготавливаем временные файлы
ФайлСкрипта = ПолучитьИмяВременногоФайла("sh");
ФайлРезультатСкрипта = ПолучитьИмяВременногоФайла("log");

// Подготавливаем файл скрипта
ПереносСтроки = Символы.ПС;
ЗаписьТекста = Новый ЗаписьТекста(ФайлСкрипта, КодировкаТекста.UTF8, ПереносСтроки);
ЗаписьТекста.ЗаписатьСтроку("#!/bin/sh");
ЗаписьТекста.ЗаписатьСтроку("");
ЗаписьТекста.Записать(ТекстКомандыДляВыполнения);
ЗаписьТекста.ЗаписатьСтроку("");
ЗаписьТекста.Закрыть();

// Конвертируем файл скрипта, удаляя все следы "Windows"
ЗапуститьПриложение("dos2unix '" + ФайлСкрипта + "'",, Истина);

// Формируем команды и выполняем с указанным таймаутом в секундах
КомандаЗапускаСкрипта = "timeout " + XMLСтрока(ТаймаутВыполненияСек) + "s /bin/bash '" 
	+ ФайлСкрипта + "' >> '" + ФайлРезультатСкрипта + "'";	
КодВозврата = Неопределено;
ЗапуститьПриложение(КомандаЗапускаСкрипта, , Истина, КодВозврата);

// Получаем результатирующий вывод приложения
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ФайлРезультатСкрипта, КодировкаТекста.UTF8);
РезультатВыполнения = ТекстовыйДокумент.ПолучитьТекст();

// Очистка данных
УдалитьФайлЕслиВозможно(ФайлСкрипта);
УдалитьФайлЕслиВозможно(ФайлРезультатСкрипта);

// Обработка результата выполнения	
Если НЕ КодВозврата = 0 Тогда
	ВызватьИсключение "Не удалось выполнить команду. Код возврата: " + КодВозврата;
КонецЕсли;

Здесь мы устанавливаем произвольный текст команды для Bash и выполняем его. В чем то прием аналогичен тому, что мы делали для Windows. Комментарии даны полные, но на паре моментов остановимся подробнее.

Некоторые нюансы

Первое, что может показаться интересным - это вызов "dos2unix" для сформированного ранее файла скрипта. Зачем это нужно? В операционной системе Windows по умолчанию для переноса строк в файлах используется последовательность символов "\r\n" (перевод каретки + перенос строки). В Unix-подобных системах используется только символ переноса строки "\n". Для Windows символ перевода каретки был добавлен для того, чтобы в древние времена можно было отправлять на печать текст без каких-либо особых драйверов. Телетайп навсегда! Этот легаси остался и по сей день и никому не мешает, ну почти.

Нам же он может сильно помешать по двум причинам:

  1. Несмотря на то, что сервер 1С установлен под Linux - все равно стандартный перенос строки платформа формирует как "\r\n". Даже если для таких классов как "ЗаписьТекста" или "ТекстовыйДокумент" устанавливать символ переноса строки другой (например, Симполв.ПС или по коду символа переноса строки равному 10), то платформа все равно использует символ перевода каретки.
  2. Еще может быть ситуация, когда текст команды для выполнения передается с клиента под управлением Windows на сервер под Linux и символы перевода каретки будут там присутствовать.

Мешать они будут потому что Bash не понимает что с ними делать. Если в файле скрипта будет содержаться символ "\r", то мы получим ошибку:

$'\r': command not found

Вот, например, обсуждение подобной проблемы. Так вот, с помощью команды "dos2unix" можно убрать все символы, несовместимые содержимым скрипта Bash и сделать его корректным. На скриншоте ниже показан пример преобразования содержимого скрипта. (Да, я использую Notepad++ даже в Linux, если Вы его узнали).

Конечно, тут есть минус - пакет "dos2unix" должен быть установлен на сервер. Сделать это проще простого. Вот так это, например, выглядит для Ubuntu:

sudo apt install dos2unix

Но это не единственная особенность. Для того, чтобы ограничить время выполнения команды мы используем штатные возможности - команду timeout. С ее помощью мы можем указать сколько времени выделяется для выполнения команды / скрипта.

timeout 10s bash 'путь к файлу скрипта или команда'

В примере выше мы выполняем некоторый скрипт с таймаутом 10 секунд. Подробнее смотрите мануал :)

Теперь Вы можете запускать приложения, скрипты или команды с помощью Bash из Linux безопасным способом.

Скрытая угроза

Частным случаем запуска процессов небезопасным образом является использование COM-объектов. Не все COM-объекты порождают процессы, которые нужно контролировать. Но, например, всеми любимые Word и Excel, которые часто до сих пор ставят на сервера, делают именно так. Они запускают соответствующий процесс "word.exe" или "excel.exe" и дальше управляют им. Не говоря уже про чистоту использования лицензий (эта тема касалась здесь), это еще и не всегда безопасно с точки зрения работы этих приложений.

Процедура СоздатьИЗаполнитьДокумент(ПутьКШаблону)
 
    ПриложениеWord = Новый COMОбъект("Word.Application");
    ОбъектДокумента = ПриложениеWord.Documents.Add(ПутьКШаблону);
 
    // ... тут какие-то действия по заполнению и сохранению ...

    // Закрываем приложение
    ОбъектДокумента.Application.Quit();
  
КонецПроцедуры

Тут все просто - в момент создания объекта документа для его обработки как-раз и создается процесс "word.exe". После завершения всех необходимых действий, метод "Quit" закрывает приложение и все работает как надо. Но что, если в момент выполнения алгоритма заполнения произойдет ошибка? Правильно, метод "Quit" не будет выполнен и процесс Word'а останется "висеть". Конечно, можно попытаться обезопасить себя как это рекомендует стандарт разработки 1С и добавить "попытку":

Процедура СоздатьИЗаполнитьДокумент(ПутьКШаблону)
 
    ПриложениеWord = Неопределено;
    ОбъектДокумента = Неопределено;

    Попытка
        ПриложениеWord = Новый COMОбъект("Word.Application");
        ОбъектДокумента = ПриложениеWord.Documents.Add(ПутьКШаблону);
    
        // ... тут какие-то действия по заполнению и сохранению ...

        // Закрываем приложение
        ОбъектДокумента.Application.Quit();
    Исключение
        
        Попытка
            ОбъектДокумента.Application.Quit();
            ОбъектДокумента = Неопределено;
        Исключение
            ОбъектДокумента = Неопределено;
        КонецПопытки;
        ПриложениеWord = Неопределено;        

    КонецПопытки;
  
КонецПроцедуры

Тут мы пытаемся закрыть приложение и освободить все связанные ресурсы. Часть кейсов это решит, но, к сожалению, не все. Если, например, в момент работы с COM-объектом возникнет не исключение, а падение рабочего процесса, то никакие действия по освобождению ресурсов выполнены не будут и процесс останется висеть в памяти до перезагрузки сервера / компьютера. Ну или пока не будет "убит" принудительно.

К сожалению, при непредвиденном завершении рабочего процесса мы особо ничего не можем сделать для контроля завершения всех запущенных процессов из кода встроенного языка. Все-таки это нештатная ситуация и решать ее можно только нештатными средствами. Почти все "костыли" по этой теме дают сбои в той или иной степени.

А у Вас на сервере бывают ситуации с десятком запущенный процессов "excel.exe"? :)

Альтернативные подходы

В качестве многоточия для этой темы хотел бы упомянуть и альтернативные способы решения проблем с освобождением ресурсов запущенных из 1С процессов:

  • Организовать bat/ps/bash скрипт, который будет ночью "убивать" определенные процессы. Например, те же "excel.exe". Костыль? Да. Работает? Да.
  • Сохранять в базе 1С (например, в регистре сведений) информацию о запущенных процессах (идентификатор процесса, имя и др.). Ночью или в другое время запускать регл. задание, которое будет проверять завершение этих процессов. Костыль? Да. Работает? Да.
  • Перезагружать сервер с периодичностью в несколько дней. О сколько проблем можно решить! :) Костыль? Да. Работает? Да :)))

Список можно продолжать и дальше. Но возможно правильным вариантом будет - поиск решения задач иным способом, а не запуском сторонних процессов. Если такое, конечно, возможно.

Удачи, друзья!

Всем чистого кода, хороших решений и меньше "костылей"! До следующих встреч!

А как Вы работаете со сторонними процессами из 1С?

Другие ссылки

Авторские разработки

 
 Другие разработки

 

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ivanov660 2424 21.07.20 09:56 Сейчас в теме
Думаю, что для части случаев будет удобнее и прозрачнее использовать компоненту на NativeAPI в качестве обертки. Даже где-то тут на сайте подобное решение было представлено публике (в части запуска/управления приложениями).
4. YPermitin 10473 21.07.20 10:17 Сейчас в теме
(1) трудно сказать, посмотреть бы на эти компоненты. Ну и если в компоненте пойдет что-то не так, то нужно постараться это все диагностировать.

Но от варианта не отказываюсь :)
2. МимохожийОднако 130 21.07.20 10:16 Сейчас в теме
ОФФ. На картинке и в заголовке немного разные по смыслу утверждения ))
3. YPermitin 10473 21.07.20 10:17 Сейчас в теме
(2) Вы заметили тонкий намек )))))
МимохожийОднако; +1 Ответить
12. ishelper 21.07.20 14:13 Сейчас в теме
(3)
Вы заметили тонкий намек )))))
"Альтернативные походы" - это тоже тонкий намек?
YPermitin; +1 Ответить
13. YPermitin 10473 21.07.20 14:14 Сейчас в теме
(12) скорее это уже тонкий намек на мою невнимательность :)))
16. YPermitin 10473 21.07.20 20:39 Сейчас в теме
5. starik-2005 2292 21.07.20 12:23 Сейчас в теме
ТекстовыйДокумент.РазделительСтрок("ВК");
BaphoBush; Fox-trot; +2 Ответить
6. YPermitin 10473 21.07.20 12:34 Сейчас в теме
(5)

ОбщегоНазначенияКлиентСервер.СообщитьПользователю("?");
7. starik-2005 2292 21.07.20 12:35 Сейчас в теме
8. YPermitin 10473 21.07.20 12:36 Сейчас в теме
9. starik-2005 2292 21.07.20 12:37 Сейчас в теме
10. zqzq 21 21.07.20 14:07 Сейчас в теме
(5)
ТекстовыйДокумент.РазделительСтрок (TextDocument.LineSeparator)
ТекстовыйДокумент (TextDocument)
РазделительСтрок (LineSeparator)
Использование:

Чтение и запись.
Описание:

Тип: Строка.
Определяет разделитель строк. Может принимать только следующие значения: ВК, ПС или ВК+ПС.
При попытке установки других значений будет инициировано исключение.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Примечание:

Значение по умолчанию ПС.
Показать
Тогда нужно вызывать
ТекстовыйДокумент.РазделительСтрок(Символы.ВК)
11. YPermitin 10473 21.07.20 14:10 Сейчас в теме
(10) да это не поможет в тех случаях, когда с клиента Windows строкой передается текст скрипта и записывается в этот текстовый документ, там символ перевода каретки сохраняется.

Хочу попробовать средствами 1С удалить символ \r с помощью потоков, то это когда доберусь до обработки интерпретатора, буду новую версию делать.
14. Altez 256 21.07.20 19:20 Сейчас в теме
(11) Через чтение/запись двоичных данных нормально удаляется
YPermitin; +1 Ответить
15. YPermitin 10473 21.07.20 19:25 Сейчас в теме
(14) я на это надеялся:)

А есть пример кода для этого дела?
17. Altez 256 21.07.20 21:01 Сейчас в теме
(15) Только 3 буквы про обрезание конца файла под рукой. Но по смыслу можно через Буфер.Получить(<Позиция>) побайтовым сравнением найти <CR>
потом
Буфер.ПолучитьСрез(<Позиция>, <Количество байт до <CR>>)
и
ЗаписатьБуферДвоичныхДанных(Буфер);

	ДвоичныеДанные = Новый ДвоичныеДанные(ФайлПолноеИмя);
	Сообщить("Размер файла: "+ДвоичныеДанные.Размер()+" байт, перезаписываем без финального конца строки(ODOAh)");   
	ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные,, ПорядокБайтов.BigEndian);
	Буфер = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(РазмерФайла-2);
	ЧтениеДанных.Закрыть();
	ДвоичныеДанные=Неопределено;
	УдалитьФайлы(ФайлПолноеИмя);
	ЗаписьДанных = Новый ЗаписьДанных(ФайлПолноеИмя);
	ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(Буфер);
	ЗаписьДанных.Закрыть();
Показать
YPermitin; +1 Ответить
18. YPermitin 10473 22.07.20 07:08 Сейчас в теме
(17) спасибо!

Поэксперементирую.
19. markers 254 22.07.20 07:53 Сейчас в теме
Я извиняюсь, но почему нельзя обойтись без dos2unix этим способом?
ПереносСтроки = Символы.ПС;
ЗаписьТекста = Новый ЗаписьТекста(ФайлСкрипта, КодировкаТекста.UTF8, ПереносСтроки);
ТекстСкрипта = "#!/bin/sh
	|
	|" + ТекстКомандыДляВыполнения + "
	|";

ЗаписьТекста.Записать(СтрЗаменить(ТекстСкрипта, Символы.ВК + Символы.ПС, Символы.ПС));
ЗаписьТекста.Закрыть();
Показать

Или вы хотите сказать, что 1С ЗаписьТекста, использует не указанный символ переноса, а всё-равно добавляет возврат каретки?
YPermitin; +1 Ответить
20. YPermitin 10473 22.07.20 08:05 Сейчас в теме
(19) я, честно, пробовал так сделать, но в файл все равно попадают символы переноса каретки.
Плюс если клиент Windows отправит текст команды на сервер Linux, то там тоже есть символ переноса каретки.

Выше я написал, что надо как-то удалить символ \r через потоки, например. Пока этим просто не занимался.
21. markers 254 22.07.20 08:08 Сейчас в теме
(20) Ну так мой код удалит \r и в команде полученной от куда бы то ни было. Даже в моем примере используется | которая по факту вставляет как вы говорите \r\n.
Мне к сожалению не где проверить, если кто может, проверьте, будет интересно.
22. YPermitin 10473 22.07.20 08:09 Сейчас в теме
23. YPermitin 10473 22.07.20 08:17 Сейчас в теме
(22) вот что получилось (см. скриншот).

Платформа настойчиво использует символ \r.

Код заменил на тот что выше.
// Подготавливаем файл скрипта
	ПереносСтроки = Символы.ПС;
	ЗаписьТекста = Новый ЗаписьТекста(ФайлСкрипта, КодировкаТекста.UTF8, ПереносСтроки);
	ТекстСкрипта = "#!/bin/sh
	|
	|" + ТекстКомандыДляВыполнения + "
	|";
	
	ЗаписьТекста.Записать(СтрЗаменить(ТекстСкрипта, Символы.ВК + Символы.ПС, Символы.ПС));
	ЗаписьТекста.Закрыть();
	//ПереносСтроки = Символы.ПС;
	//ЗаписьТекста = Новый ЗаписьТекста(ФайлСкрипта, КодировкаТекста.UTF8, ПереносСтроки);
	//ЗаписьТекста.ЗаписатьСтроку("#!/bin/sh");
	//ЗаписьТекста.ЗаписатьСтроку("");
	//ЗаписьТекста.Записать(ТекстКомандыДляВыполнения);
	//ЗаписьТекста.ЗаписатьСтроку("");
	//ЗаписьТекста.Закрыть();
Показать


У меня возникла мысль, что возможно это "фича" платформы.
В том плане, что я открываю конфигуратор и клиентское приложение на ОС Windows, а сервер под Linux.
И даже то, что я отлаживаю серверный код под Windows может влияет на используемые символы переноса строк в тексте?

В общем, надо еще ковырять. Но замену костылю dos2unix я в любом случае найду, просто позже.
Прикрепленные файлы:
24. markers 254 22.07.20 08:42 Сейчас в теме
(23) хм. спасибо за проверку. возможно есть и косяк платформы, которая стараясь уравнять условия работы в винде и линуксе, в данном случае делает косяк.
YPermitin; +1 Ответить
25. YPermitin 10473 22.07.20 08:44 Сейчас в теме
(24) еще одна загадка. Повод для новой статьи :))))
26. Altez 256 22.07.20 13:58 Сейчас в теме
(24) Это не платформы скорее косяк , а низкоуровневых библиотек. В си встречается такая же проблема с записью текста. Пруфа нет, респект тому, кто достанет и разложит по понятиям.
27. Yashazz 3735 22.07.20 17:15 Сейчас в теме
Ну вот. Хотел позлобствовать, наехать, а тут такая хорошая публикация. Разве что заглавная картинка совершенно не подходит к содержанию, но такое некоторым на ИС можно выкладывать.
28. German 874 24.07.20 15:31 Сейчас в теме
В PowerShell лишнее
"  > """ + ВременныйФайлРезультат + """

а как сделать окно в свернутом виде?
YPermitin; +1 Ответить
29. YPermitin 10473 24.07.20 15:59 Сейчас в теме
(28)
В PowerShell лишнее


В данном случае да. Можно результат выполнения в файл не сохранять.

а как сделать окно в свернутом виде?


Вместо Exec можно использовать Run, но тогда есть риск, что приложение "зависнет" и потом приложения будет ожидать бесконечно.
Я так понимаю, что при выполнении на клиенте появляется такое окно.

Гарантированного способа скрыть консоль не искал, разве что выполнять команду Run и каким-то другим образом проверять не зависнет ли.
Либо ... делать внешнюю компоненту для таких дел.
Но может есть и проще способ.
30. DO_WHILE_LOOP 345 25.09.20 21:44 Сейчас в теме
Пример скрытия консольного окна (для windows) можно посмотреть здесь
используется утилита hidec.exe обсуждение и исходники утилиты
Оставьте свое сообщение

См. также

Звуковое управление в 1С 8.3 Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    2681    velemir    28    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    2881    Neti    7    

Обзор полезных методов БСП 3.1.4

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

Библиотека стандартных подсистем (далее - БСП) является частью любой типовой конфигурации, поэтому умение применять готовые процедуры и функции повышает качество разработки и избавляет от написания лишнего кода. К сожалению, не у всех есть время и упорство овладеть всей документацией, поэтому я собрал воедино наиболее популярный функционал.

25.03.2021    11223    rayastar    45    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

В данной публикации я опишу полезные процедуры и функции модуля общего назначения библиотеки стандартных подсистем, обязательные к использованию любым программистом 1С.

30.08.2020    12500    quazare    34    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    5125    comol    31    

Экспорт журнала регистрации. Набор инструментов (приложения + исходный код)

Прочие инструменты разработчика Журнал регистрации Абонемент ($m)

Набор инструментов для экспорта данных журнала регистрации во внешние хранилища для Windows и Linux (SQL Server, PostgreSQL, MySQL). Готовые приложения и исходный код.

10 стартмани

26.05.2020    7323    47    YPermitin    0    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    41817    user5300    17    

История работы пользователей (отчет на СКД)

Администрирование СУБД v8 v8::УФ v8::СКД 1cv8.cf Абонемент ($m)

Отчет для просмотра истории работы пользователей (СКД, просмотр для любого пользователя).

2 стартмани

14.03.2020    7893    75    YPermitin    27    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    38861    unichkin    74    

Информация о пользователях информационной базы (отчет на СКД)

Администрирование данных 1С Роли и права v8 v8::Права v8::СКД 1cv8.cf Абонемент ($m)

Два простых отчета по пользователям информационной базы и информации по ним.

1 стартмани

02.03.2020    7586    24    YPermitin    8    

Технические проверки данных регистров бухгалтерии (отчет на СКД)

Администрирование данных 1С Бухгалтерский учет Механизмы бухгалтерского учета v8::БУ 1cv8.cf БУ Абонемент ($m)

Отчет для технических проверок данных бухгалтерских регистров.

5 стартмани

25.02.2020    7168    26    YPermitin    2    

Мастер полнотекстового поиска

Поиск данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Набор инструментов для работы с полнотекстовым индексом платформы 1С. Стандартные и расширенные возможности.

2 стартмани

07.02.2020    11653    108    YPermitin    28    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    32622    tormozit    105    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    43144    ids79    26    

Помощник работы с идентификаторами объектов

Прочие инструменты разработчика Поиск данных v8 1cv8.cf Абонемент ($m)

Инструмент для расширенного анализа идентификаторов объектов.

2 стартмани

24.01.2020    13388    51    YPermitin    32    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    32520    John_d    22    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    79728    tormozit    131    

Транслятор запросов 1С в SQL

Производительность и оптимизация (HighLoad) Администрирование СУБД v8 v8::Запросы 1cv8.cf Абонемент ($m)

Инструмент для трансляции запросов платформы 1С в SQL, а также их диагностики.

10 стартмани

07.01.2020    19752    163    YPermitin    89    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    25022    kuzyara    38    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    19605    YPermitin    60    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    50633    tormozit    48    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    10217    Sibars    19    

Командный интерпретатор для 1С

Сервисные утилиты v8 1cv8.cf Абонемент ($m)

Инструмент для выполнения команд CMD / PowerShell из 1С.

2 стартмани

15.11.2019    14260    28    YPermitin    41    

Пакетная выгрузка / загрузка внешних отчетов и обработок

Прочие инструменты разработчика Менеджеры внешних отчетов v8 1cv8.cf Абонемент ($m)

Пакетная выгрузка / загрузка внешних отчетов и обработок для массовый манипуляций с ними.

2 стартмани

04.11.2019    11537    60    YPermitin    22    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    47485    tormozit    74    

Обозреватель криптографии

Инструментарий разработчика Защита ПО v8 Абонемент ($m)

Отчет для просмотра доступных провайдеров и сертификатов криптографии на сервере и клиенте.

2 стартмани

21.10.2019    12174    15    YPermitin    10    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

Все мы пишем программный код и часто используем процедуры, облегчающие его написание. Ниже приведена выборка таких полезных процедур и функций.

07.10.2019    34248    HostHost    41    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    42588    Yashazz    50    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    16614    m-rv    2    

О программе Postman для тестирования API и для чего она нужна 1С-нику

Практика программирования Программное обеспечение (software) v8 Бесплатно (free)

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    15446    budidich    28    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    72659    rpgshnik    70    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    61130    ids79    55    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    21213    m-rv    17    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    34811    YPermitin    25    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    27559    YPermitin    81    

Анализ производительности APDEX

Производительность и оптимизация (HighLoad) v8 1cv8.cf Бесплатно (free)

Отчет для просмотра и анализа замеров производительности в конфигурациях на базе БСП.

31.08.2019    14371    315    YPermitin    7    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    32953    m-rv    22    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    37845    ids79    16    

Путеводитель по истории релизов

WEB v8 1cv8.cf Абонемент ($m)

Отчет по истории выпуска релизов и анализа информации по обновлениям.

5 стартмани

13.08.2019    15737    13    YPermitin    18    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    114522    ids79    69    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    29010    itriot11    34    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    46761    avalakh    26    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    31306    json    15    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    81269    ids79    14    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    79069    Serginio    113    

Просмотр и анализ структуры базы данных (отчет на СКД)

Инструментарий разработчика v8 v8::СКД 1cv8.cf Абонемент ($m)

Отчет для просмотра и анализа структуры базы данных с поддержкой файловых баз (ограниченный режим), а также баз на SQL Server и PostgreSQL.

5 стартмани

24.07.2019    25645    234    YPermitin    27    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    41299    ids79    27    

1C linux Centos 7. ЗапуститьПриложение, работа с "1cv8" из 1С на сервере

Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

Работа с "1cv8" на linux сервере из самой 1С. Как известно для работы "1cv8" в linux требуется графический интерфейс. А что делать если работа с "1cv8" требуется только на сервере и где вообще нет GUI.

16.07.2019    3117    ryzn    7    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    38592    ids79    40    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    29252    YPermitin    14    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    20635    SeiOkami    50