8.х Работа с командной строкой из 1С 8.2

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Euronymous, 5 авг 2014.

  1. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Добрый день. Каким образом можно программно обратиться к командной строке винды из 1С и задать пару-тройку команд вроде "cd "D:/1C/Lalala/bububu/""?
    Гугл почему-то выдаёт огромное количество статей обратной последовательности: Вызов 1С из командной строки, работа с храном из командной строки и т.д.
    Буду чертовски благодарен за любые ссылки и материалы:)
  2. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    а просто заглянуть в СП?
    upload_2014-8-5_23-17-0.png
    Euronymous нравится это.
  3. Persempre
    Offline

    Persempre Опытный в 1С

    Регистрация:
    18 июл 2012
    Сообщения:
    851
    Симпатии:
    3
    Баллы:
    29
    Или так
    &НаСервере
    Функция Ping(IPАдрес)
    ObjShell = Новый COMОбъект("WScript.Shell") ;
    ObjScriptExec = ObjShell.Exec("ping.exe -n 1 " + IPАдрес);
    StrPingResults = НРег(ObjScriptExec.StdOut.ReadAll());
    Возврат Найти(StrPingResults, "ttl=");
    КонецФункции
    Euronymous нравится это.
  4. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Код:
    КомандаСистемы("D:");
    КомандаСистемы("cd" """CTT/EDSSigner/EDSSigner/""");
    КомандаСистемы("java.exe -jar EDSSigner.jar" + ВыгруженныйФайл);
    А как правильно выполнить сразу 3 команды? Если прописывать их вручную - запускается окно стороннего приложения, если выполнять команды программно ничего не происходит
  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Тогла либо ручками, либо из 1С создаете файлик .bat и его запускаете , а потом удаляете. Все старо как мир
    Euronymous нравится это.
  6. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Батник запускается, вроде даже выполняется (успел поймать этот момент), но приложение все равно не запускается:(
    Код:
    ПутьBAT = ПутьКБатнику;
        Текст   = Новый ЗаписьТекста(ПутьBAT, КодировкаТекста.ANSI);
        Текст.ЗаписатьСтроку("D:");
        Текст.ЗаписатьСтроку("cd" """CTT/EDSSigner/EDSSigner/""");
        Текст.ЗаписатьСтроку("java.exe -jar EDSSigner.jar" + ВыгруженныйФайл);
       
        Текст.ЗаписатьСтроку("exit");
        Текст.Закрыть();
        КомандаСистемы("start " + ПутьBAT);
  7. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    а запустить с указанием полного пути? а не двух команд перехода?
    Код:
        Текст.ЗаписатьСтроку("D:\CTT\EDSSigner\EDSSigner\java.exe -jar EDSSigner.jar " + ВыгруженныйФайл);
    
    и что-то не понял
    тут куча кавычек, для пробела? и тот ли слэш?
    Код:
    Текст.ЗаписатьСтроку("cd" """CTT/EDSSigner/EDSSigner/""");
    тут всё в одну строку с пробелом
    Код:
        Текст.ЗаписатьСтроку("java.exe -jar EDSSigner.jar" + ВыгруженныйФайл);
    
    и плюс тут на выходе получиться - "java.exe -jar EDSSigner.jarВыгруженныйФайл", разница заметна?

    и что за "ВыгруженныйФайл"?
    Euronymous нравится это.
  8. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Все косяки с пробелами и кавычками уже поправил, результат тот же. ВыгруженныйФайл путь к XML файлу, который нужно открыть через приложение.
    Открыл батник, из него вручную ввел все команды, все отлично работает, но сам батник почему-то ничего не делает.

    Проблема в кодировке, русские символы не правильно читает, сейчас разбираюсь
  9. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    юзай латиницу, можно в транслите :)
    Euronymous нравится это.
  10. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Проблема решена заменой кодировки на OEM, получившийся код:

    Код:
    ПутьBAT = "Некий путь к батнику";
    Текст   = Новый ЗаписьТекста(ПутьBAT, КодировкаТекста.OEM);
    Текст.ЗаписатьСтроку("D:");
    Текст.ЗаписатьСтроку("cd ""CTT/EDSSigner/EDSSigner/""");
    Текст.ЗаписатьСтроку("java.exe -jar EDSSigner.jar " + """" + "Некий путь к открываемому файлу" + """");
    Текст.ЗаписатьСтроку("exit");
    Текст.Закрыть();
    КомандаСистемы("start " + ПутьBAT);
    УдалитьФайлы(ПутьBAT);
    
    Всем спасибо за участие :)
    Последнее редактирование: 7 авг 2014
  11. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    кстати, если бы батник вызывался в переназначение вывода с экрана на файл, то кодировка бы сразу вылезла скорее всего, да и ошибки

    Код:
    КомандаСистемы("start " + ПутьBAT+" >>c:\info.txt");
    PS
    одинарная ">" - вывод в файл с его перезаписью, если он есть
    двойная ">>" - вывод с добавлением в файл

    и в файле info.txt в корне С: был весь вывод команд и их сообщений из батника
    Euronymous нравится это.
  12. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Почему-то если в конце прописать
    Код:
    УдалитьФайлы(ПутьBAT);
    вылетает [​IMG]
    Но без удалить все работает отлично, видимо 1С удаляет батник ещё до того как он полностью отработал, как это можно исправить?
  13. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    один из вариантов ввести паузу/задержку перед удалением
  14. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Каким образом? Пустой цикл?-Hungover-
  15. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    можно цикл, можно чуть позже по коду, можно перед выходом, можно при запуске, можно перед запуском батника проверять наличие и удалять
    --- Объединение сообщений, 7 авг 2014 ---
    кстати, можно использовать
    Код:
    Глобальный контекст (Global context)
    ЗапуститьПриложение (RunApp)
    Синтаксис:
    
    ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>, <КодВозврата>)
    
    Параметры:
    
    <СтрокаКоманды> (обязательный)
    
    Тип: Строка. 
    Командная строка для запуска приложения либо имя файла, ассоциированного с некоторым приложением.  
    
    Пример:
    // открытие файла MS ExcelЗапуститьПриложение("Таблица.xls");
     
    если в системе сделать соответствие
    Euronymous нравится это.
  16. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Попробуйте вставить
    Текст = Неопределено;
    после Текст.Закрыть();

    И в любом случае (безотносительно к вышесказанному поможет или нет) удаление файлов должно быть в блоке Попытка-Исключение.
  17. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Результат тот же :confused:
    --- Объединение сообщений, 7 авг 2014 ---
    Если только через обработчик ожидания отдельно вызывать процедуру по удалению батников, но хотелось бы как-нибудь разобраться без его участия
  18. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.429
    Симпатии:
    372
    Баллы:
    104
    батник перед запуском можно проверять на наличие и удалять

    проверить так можно например
    Код:
            Флаг = Новый Файл(ФлагСправочника);
            Если Флаг.Существует() Тогда
                Предупреждение("Флаг загрузки справочника на кассу уже существует! Дождитесь его обработки...");
                Возврат;
            КонецЕсли;   
    
  19. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А.. Не так понял. Я подумал, что наоборот у вас не может удалить файл после того как bat отработал.
  20. TopicStarter Overlay
    Euronymous
    Offline

    Euronymous Опытный в 1С

    Регистрация:
    19 фев 2014
    Сообщения:
    206
    Симпатии:
    0
    Баллы:
    26
    Сделал таким образом (всё же через обработчик ожидания):

    Код:
    &НаКлиенте
    Процедура ПодписатьЭЦП(Команда)
      
        ВыгруженныйФайл = ВыгрузитьНаПодпись(Объект.Ссылка);
        ПутьBAT = Объект.Ссылка.СоглашениеЭД.РесурсИсходящихЭЦП + "file.bat";
        Текст   = Новый ЗаписьТекста(ПутьBAT, КодировкаТекста.OEM);
        Текст.ЗаписатьСтроку("D:");
        Текст.ЗаписатьСтроку("cd ""CTT/EDSSigner/EDSSigner/""");
        Текст.ЗаписатьСтроку("java.exe -jar EDSSigner.jar " + """" + ВыгруженныйФайл + """");
        Текст.ЗаписатьСтроку("exit");
        Текст.Закрыть();
        КомандаСистемы("start " + ПутьBAT);
      
        ПодключитьОбработчикОжидания("УдалитьБатник", 20, Истина);
      
    КонецПроцедуры
    
    В модуль управляемого приложения добавил:

    Код:
    Процедура УдалитьБатник() Экспорт
    
        Попытка
            УдалитьФайлы(ПутьBAT);
            ОтключитьОбработчикОжидания("УдалитьБатник");
        Исключение
        КонецПопытки;
    
    КонецПроцедуры
    
    И завел глобальную переменную "ПутьBAT" в том же модуле

Поделиться этой страницей