Скрипт VBS из 1с 7.7 выполняется не так

1. PallSann 15.03.25 16:30 Сейчас в теме
В общем. Долго искал решение для отправки zip файла на сервер одной организации, испробовал некоторые решения, пришел к выводу использовать скрипт VBS, вроде как должен выполняться без затыков, НО. Если скрипт запускаю из командной строки, он выполняется как должен, но если пытаюсь его выполнить из 1с то получаю ошибку 503 - Service Unavailable.

Сама функция:
Функция SendFileToServer()
	Попытка
	    ScrCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
	    ScrCtrl.Language = "VBScript";

            Скрипт = ("
	   	|Function Send()
		|	Dim httpRequest
		|	Set httpRequest = CreateObject(""MSXML2.ServerXMLHTTP.6.0"")
		|
		|	' URL для отправки
		|	URL = ""https://tu.market/api/importFile?firmID=5225&testMode=True""
		|
		|	' открываем соединение
		|	httpRequest.Open ""POST"", URL, False
		|
		|	' устанавливаем заголовки
		|	Dim boundary
		|	boundary = ""----"" & CStr(Timer)
		|	httpRequest.setRequestHeader ""Content-Type"", ""multipart/form-data; boundary=""& boundary
		|	httpRequest.setRequestHeader ""Authorization"", ""Basic dHVtYXJrZXQ6767CMzgwNjktRTZDMy00QzNGLThBNUIt5646RjQ3N0M3NjJB­""
		|
		|	' указываем путь к файлу
		|	Path = ""D:\import_tu.zip""
		|
		|	'создаем поток для чтения файла
		|	Dim Stream
		|	Set Stream = CreateObject(""ADODB.Stream"")
		|	Stream.Type = 1 ' тип бинарных данных
		|	Stream.Open
		|	Stream.LoadFromFile Path
		|
		|	' Создаем новый поток для объединения данных
		|	Dim fullStream
		|	Set fullStream = CreateObject(""ADODB.Stream"")
		|	fullStream.Type = 1 ' Тип бинарных данных
		|	fullStream.Open
		|
		|	' Формируем тело запроса
		|	Dim body
		|	body = ""--"" & boundary & vbCrLf
		|	body = body & ""Content-Disposition: form-data; name=""""name""""; filename=""""import_tu.zip"""""" & vbCrLf
		|	body = body & ""Content-Type: application/zip"" & vbCrLf & vbCrLf
		|
		|	' Добавляем текстовую часть в поток
		|	fullStream.Write TextToBytes(body)
		|
		|	' Добавляем данные файла в поток
		|	fullStream.Write Stream.Read
		|
		|	' Завершаем тело запроса
		|	Dim endBoundary
		|	endBoundary = vbCrLf & ""--"" & boundary & ""--""
		|
		|	' Добавляем завершающую часть в поток
		|	fullStream.Write TextToBytes(endBoundary)
		|
		|	' Устанавливаем позицию потока на начало
		|	fullStream.Position = 0
		|
		|	' Отправляем запрос с полным телом
		|	httpRequest.send fullStream.Read
		|
		|	' Обрабатываем ответ и сохраняем его в файл
		|	Dim responseText
		|	If httpRequest.Status = 200 Then
		|		responseText = httpRequest.ResponseText
		|	Else
		|		responseText = ""Ошибка: "" & httpRequest.Status & "" - "" & httpRequest.StatusText
		|	End If
		|
		|	' Сохраняем ответ в файл
		|	SaveResponseToFile responseText, ""D:\ResponseTextTu.txt""
		|
		|	' Закрываем потоки
		|	Stream.Close
		|	fullStream.Close
		|	Set Stream = Nothing
		|	Set fullStream = Nothing
		|
		|	' Возвращаем результат
		|	SendFile = responseText
		|End Function
		|
		|' Функция для записи сообщений в лог
		|Sub LogMessage(message)
		|	Dim logStream
		|	Set logStream = CreateObject(""ADODB.Stream"")
		|
		|	logStream.Type = 2 ' Тип текстовых данных
		|	logStream.Charset = ""utf-8"" ' Указываем кодировку
		|	logStream.Open
		|
		|	' Проверяем, существует ли файл
		|	On Error Resume Next
		|	logStream.LoadFromFile ""D:\script_log.txt""
		|	On Error GoTo 0 ' Возвращаем обработку ошибок
		|
		|	logStream.Position = logStream.Size ' Перемещаем курсор в конец файла
		|	' Записываем новое сообщение
		|	logStream.WriteText Now & "" - "" & CStr(message) & vbCrLf, 1 ' 1 = добавить к существующему
		|
		|	' Сохраняем изменения в файл
		|	logStream.SaveToFile ""D:\script_log.txt"", 2 ' 2 = Создать новый файл или перезаписать
		|	logStream.Close
		|	Set logStream = Nothing
		|End Sub		
		|
		|' Функция для преобразования текстовых данных в массив байтов
		|Function TextToBytes(text)
		|	Dim byteStream
		|	Set byteStream = CreateObject(""ADODB.Stream"")
		|	byteStream.Type = 2 ' Тип текстовых данных
		|	byteStream.Charset = ""utf-8"" ' Указываем кодировку
		|	byteStream.Open
		|	byteStream.WriteText text
		|	byteStream.Position = 0
		|	byteStream.Type = 1 ' Меняем тип на бинарные данные
		|	Dim byteArray
		|	byteArray = byteStream.Read
		|	byteStream.Close
		|	Set byteStream = Nothing
		|	TextToBytes = byteArray
		|End Function
		|
		|' Функция для сохранения ответа в файл
		|Sub SaveResponseToFile(responseText, filePath)
		|	Dim fileStream
		|	Set fileStream = CreateObject(""ADODB.Stream"")
		|	fileStream.Type = 2 ' Тип текстовых данных
		|	fileStream.Charset = ""utf-8"" ' Указываем кодировку
		|	fileStream.Open
		|	fileStream.WriteText responseText
		|	fileStream.SaveToFile filePath, 2 ' 2 = Создать новый файл или перезаписать
		|	fileStream.Close
		|	Set fileStream = Nothing
		|End Sub
		|");
		
		ScrCtrl.AddCode (Скрипт);
		Возврат ScrCtrl.Run("Send");
	Исключение
		Сообщить("Строка с ошибкой: "+ScrCtrl.Error.Text);
		Сообщить("Error.Number: "+ScrCtrl.Error.Number);
		Сообщить("Error.Description: "+ScrCtrl.Error.Description);
		Сообщить("Error.Line: "+ScrCtrl.Error.Line);
		Сообщить("Error.Column: "+ScrCtrl.Error.Column);
		Сообщить("Error.Source: "+ScrCtrl.Error.Source);
    	Возврат ОписаниеОшибки();
	КонецПопытки;
КонецФункции 
Показать

Собстна вопрос. В чем трабла?
По теме из базы знаний
Найденные решения
4. PallSann 17.03.25 11:16 Сейчас в теме
Победил данный скрипт.

Функция SendFileToServer(Путь,ИмяФ) 
    Если ТестовыйТу = 1 Тогда
        Тестовый = "true";
    Иначе
        Тестовый = "false";
    КонецЕсли;
    
    Адрес = СокрЛП(ТекстЗапросаURLТу);
    ФайлОтвета = ТекстПапкаФТПТу+"\ResponseTextTu.txt";
    ЛогФайл = ТекстПапкаФТПТу+"\Script_log.txt";
    
    Попытка
        ScrCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
        ScrCtrl.Language = "VBScript";

        Скрипт = "
        |Function Send()
        |    Dim httpRequest
        |    Set httpRequest = CreateObject(""MSXML2.ServerXMLHTTP.6.0"")
        |
        |    ' URL для отправки
        |    URL = """+Адрес+"""
        |
        |    ' открываем соединение
        |    httpRequest.Open ""POST"", URL, False
        |
        |    ' устанавливаем заголовки
        |    Dim boundary
        |    boundary = ""----"" & CStr(Timer)
        |    httpRequest.setRequestHeader ""Content-Type"", ""multipart/form-data; boundary=""& boundary
        |    httpRequest.setRequestHeader ""Authorization"", ""Basic "+ПарольФТПТу+"""
        |
        |    ' указываем путь к файлу
        |    Path = """+Путь+"""
        |
        |    'создаем поток для чтения файла
        |    Dim Stream
        |    Set Stream = CreateObject(""ADODB.Stream"")
        |    Stream.Type = 1 ' тип бинарных данных
        |    Stream.Open
        |    Stream.LoadFromFile Path
        |
        |    ' Создаем новый поток для объединения данных
        |    Dim fullStream
        |    Set fullStream = CreateObject(""ADODB.Stream"")
        |    fullStream.Type = 1 ' Тип бинарных данных
        |    fullStream.Open
        |
        |    ' Формируем тело запроса
        |    Dim body
        |    body = """"
        |    body = body & ""--"" & boundary & vbCrLf
        |    body = body & ""Content-Disposition: form-data; name=""""firmID"""""" & vbCrLf & vbCrLf
        |    body = body & """+ИдентификаторФирмы+""" & vbCrLf
        |    body = body & ""--"" & boundary & vbCrLf
        |    body = body & ""Content-Disposition: form-data; name=""""testMode"""""" & vbCrLf & vbCrLf
        |    body = body & """+Тестовый+""" & vbCrLf
        |    body = body & ""--"" & boundary & vbCrLf
        |    body = body & ""Content-Disposition: form-data; name=""""file""""; filename="""""+ИмяФ+""""""" & vbCrLf
        |    body = body & ""Content-Type: application/zip"" & vbCrLf & vbCrLf
        |
        |    ' Добавляем текстовую часть в поток
        |    fullStream.Write TextToBytes(body)
        |
        |    ' Добавляем данные файла в поток
        |    fullStream.Write Stream.Read
        |
        |    ' Завершаем тело запроса
        |    Dim endBoundary
        |    endBoundary = vbCrLf & ""--"" & boundary & ""--""
        |
        |    ' Добавляем завершающую часть в поток
        |    fullStream.Write TextToBytes(endBoundary)
        |
        |    ' Устанавливаем позицию потока на начало
        |    fullStream.Position = 0
        |
        |    ' Отправляем запрос с полным телом
        |    httpRequest.send fullStream.Read
        |
        |    ' Обрабатываем ответ и сохраняем его в файл
        |    Dim responseText
        |    If httpRequest.Status = 200 Then
        |        responseText = httpRequest.ResponseText
        |    Else
        |        responseText = ""Ошибка: "" & httpRequest.Status & "" - "" & httpRequest.StatusText '& "" - "" & httpRequest.responseText
        |    End If
        |
        |    ' Сохраняем ответ в файл
        |    SaveResponseToFile responseText, """+ФайлОтвета+"""
        |
        |    ' Закрываем потоки
        |    Stream.Close
        |    fullStream.Close
        |    Set Stream = Nothing
        |    Set fullStream = Nothing
        |
        |    ' Возвращаем результат
        |    SendFile = responseText
        |End Function
        |
        |' Функция для записи сообщений в лог
        |Sub LogMessage(message)
        |    Dim logStream
        |    Set logStream = CreateObject(""ADODB.Stream"")
        |
        |    logStream.Type = 2 ' Тип текстовых данных
        |    logStream.Charset = ""utf-8"" ' Указываем кодировку
        |    logStream.Open
        |
        |    ' Проверяем, существует ли файл
        |    On Error Resume Next
        |    logStream.LoadFromFile """+ЛогФайл+"""
        |    On Error GoTo 0 ' Возвращаем обработку ошибок
        |
        |    logStream.Position = logStream.Size ' Перемещаем курсор в конец файла
        |    ' Записываем новое сообщение
        |    logStream.WriteText Now & "" - "" & CStr(message) & vbCrLf, 1 ' 1 = добавить к существующему
        |
        |    ' Сохраняем изменения в файл
        |    logStream.SaveToFile """+ЛогФайл+""", 2 ' 2 = Создать новый файл или перезаписать
        |    logStream.Close
        |    Set logStream = Nothing
        |End Sub        
        |
        |' Функция для преобразования текстовых данных в массив байтов
        |Function TextToBytes(text)
        |    Dim byteStream
        |    Set byteStream = CreateObject(""ADODB.Stream"")
        |    byteStream.Type = 2 ' Тип текстовых данных
        |    byteStream.Charset = ""utf-8"" ' Указываем кодировку
        |    byteStream.Open
        |    byteStream.WriteText text
        |    byteStream.Position = 0
        |    byteStream.Type = 1 ' Меняем тип на бинарные данные
        |    Dim byteArray
        |    byteArray = byteStream.Read
        |    byteStream.Close
        |    Set byteStream = Nothing
        |    TextToBytes = byteArray
        |End Function
        |
        |' Функция для сохранения ответа в файл
        |Sub SaveResponseToFile(responseText, filePath)
        |    Dim fileStream
        |    Set fileStream = CreateObject(""ADODB.Stream"")
        |    fileStream.Type = 2 ' Тип текстовых данных
        |    fileStream.Charset = ""utf-8"" ' Указываем кодировку
        |    fileStream.Open
        |    fileStream.WriteText responseText
        |    fileStream.SaveToFile filePath, 2 ' 2 = Создать новый файл или перезаписать
        |    fileStream.Close
        |    Set fileStream = Nothing
        |End Sub
        |";
        ScrCtrl.AddCode (Скрипт);
        Состояние("Выполнение скрипта на отправку файла обновления...");
        Возврат ScrCtrl.Run("Send");
    Исключение
        Сообщить("Строка с ошибкой: "+ScrCtrl.Error.Text);
        Сообщить("Error.Number: "+ScrCtrl.Error.Number);
        Сообщить("Error.Description: "+ScrCtrl.Error.Description);
        Сообщить("Error.Line: "+ScrCtrl.Error.Line);
        Сообщить("Error.Column: "+ScrCtrl.Error.Column);
        Сообщить("Error.Source: "+ScrCtrl.Error.Source);
        Возврат ОписаниеОшибки();
    КонецПопытки;
КонецФункции
Показать


Затык был в этих строках firmID="+ИдентификаторФирмы+" testMode="+Тестовый, непонятно куда их надо было подставлять. Данная функция полностью рабочая, но есть небольшое такое НО. Файл размером 690 Мб не смог обработать, вывалился с ошибкой о нехватке памяти.
Если кто знает каким другим способом выгрузить, подскажите. Где-то встречал что можно в поток выгружать не весь файл, а частями, где видел не помню. Подскажите.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1936660 15.03.25 19:44 Сейчас в теме
(1)
В чем
Там в теле ответа что написано?
3. PallSann 16.03.25 05:58 Сейчас в теме
(2) в ответе приходит код html страницы, содержимое в файле
Прикрепленные файлы:
Сайт.html
4. PallSann 17.03.25 11:16 Сейчас в теме
Победил данный скрипт.

Функция SendFileToServer(Путь,ИмяФ) 
    Если ТестовыйТу = 1 Тогда
        Тестовый = "true";
    Иначе
        Тестовый = "false";
    КонецЕсли;
    
    Адрес = СокрЛП(ТекстЗапросаURLТу);
    ФайлОтвета = ТекстПапкаФТПТу+"\ResponseTextTu.txt";
    ЛогФайл = ТекстПапкаФТПТу+"\Script_log.txt";
    
    Попытка
        ScrCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
        ScrCtrl.Language = "VBScript";

        Скрипт = "
        |Function Send()
        |    Dim httpRequest
        |    Set httpRequest = CreateObject(""MSXML2.ServerXMLHTTP.6.0"")
        |
        |    ' URL для отправки
        |    URL = """+Адрес+"""
        |
        |    ' открываем соединение
        |    httpRequest.Open ""POST"", URL, False
        |
        |    ' устанавливаем заголовки
        |    Dim boundary
        |    boundary = ""----"" & CStr(Timer)
        |    httpRequest.setRequestHeader ""Content-Type"", ""multipart/form-data; boundary=""& boundary
        |    httpRequest.setRequestHeader ""Authorization"", ""Basic "+ПарольФТПТу+"""
        |
        |    ' указываем путь к файлу
        |    Path = """+Путь+"""
        |
        |    'создаем поток для чтения файла
        |    Dim Stream
        |    Set Stream = CreateObject(""ADODB.Stream"")
        |    Stream.Type = 1 ' тип бинарных данных
        |    Stream.Open
        |    Stream.LoadFromFile Path
        |
        |    ' Создаем новый поток для объединения данных
        |    Dim fullStream
        |    Set fullStream = CreateObject(""ADODB.Stream"")
        |    fullStream.Type = 1 ' Тип бинарных данных
        |    fullStream.Open
        |
        |    ' Формируем тело запроса
        |    Dim body
        |    body = """"
        |    body = body & ""--"" & boundary & vbCrLf
        |    body = body & ""Content-Disposition: form-data; name=""""firmID"""""" & vbCrLf & vbCrLf
        |    body = body & """+ИдентификаторФирмы+""" & vbCrLf
        |    body = body & ""--"" & boundary & vbCrLf
        |    body = body & ""Content-Disposition: form-data; name=""""testMode"""""" & vbCrLf & vbCrLf
        |    body = body & """+Тестовый+""" & vbCrLf
        |    body = body & ""--"" & boundary & vbCrLf
        |    body = body & ""Content-Disposition: form-data; name=""""file""""; filename="""""+ИмяФ+""""""" & vbCrLf
        |    body = body & ""Content-Type: application/zip"" & vbCrLf & vbCrLf
        |
        |    ' Добавляем текстовую часть в поток
        |    fullStream.Write TextToBytes(body)
        |
        |    ' Добавляем данные файла в поток
        |    fullStream.Write Stream.Read
        |
        |    ' Завершаем тело запроса
        |    Dim endBoundary
        |    endBoundary = vbCrLf & ""--"" & boundary & ""--""
        |
        |    ' Добавляем завершающую часть в поток
        |    fullStream.Write TextToBytes(endBoundary)
        |
        |    ' Устанавливаем позицию потока на начало
        |    fullStream.Position = 0
        |
        |    ' Отправляем запрос с полным телом
        |    httpRequest.send fullStream.Read
        |
        |    ' Обрабатываем ответ и сохраняем его в файл
        |    Dim responseText
        |    If httpRequest.Status = 200 Then
        |        responseText = httpRequest.ResponseText
        |    Else
        |        responseText = ""Ошибка: "" & httpRequest.Status & "" - "" & httpRequest.StatusText '& "" - "" & httpRequest.responseText
        |    End If
        |
        |    ' Сохраняем ответ в файл
        |    SaveResponseToFile responseText, """+ФайлОтвета+"""
        |
        |    ' Закрываем потоки
        |    Stream.Close
        |    fullStream.Close
        |    Set Stream = Nothing
        |    Set fullStream = Nothing
        |
        |    ' Возвращаем результат
        |    SendFile = responseText
        |End Function
        |
        |' Функция для записи сообщений в лог
        |Sub LogMessage(message)
        |    Dim logStream
        |    Set logStream = CreateObject(""ADODB.Stream"")
        |
        |    logStream.Type = 2 ' Тип текстовых данных
        |    logStream.Charset = ""utf-8"" ' Указываем кодировку
        |    logStream.Open
        |
        |    ' Проверяем, существует ли файл
        |    On Error Resume Next
        |    logStream.LoadFromFile """+ЛогФайл+"""
        |    On Error GoTo 0 ' Возвращаем обработку ошибок
        |
        |    logStream.Position = logStream.Size ' Перемещаем курсор в конец файла
        |    ' Записываем новое сообщение
        |    logStream.WriteText Now & "" - "" & CStr(message) & vbCrLf, 1 ' 1 = добавить к существующему
        |
        |    ' Сохраняем изменения в файл
        |    logStream.SaveToFile """+ЛогФайл+""", 2 ' 2 = Создать новый файл или перезаписать
        |    logStream.Close
        |    Set logStream = Nothing
        |End Sub        
        |
        |' Функция для преобразования текстовых данных в массив байтов
        |Function TextToBytes(text)
        |    Dim byteStream
        |    Set byteStream = CreateObject(""ADODB.Stream"")
        |    byteStream.Type = 2 ' Тип текстовых данных
        |    byteStream.Charset = ""utf-8"" ' Указываем кодировку
        |    byteStream.Open
        |    byteStream.WriteText text
        |    byteStream.Position = 0
        |    byteStream.Type = 1 ' Меняем тип на бинарные данные
        |    Dim byteArray
        |    byteArray = byteStream.Read
        |    byteStream.Close
        |    Set byteStream = Nothing
        |    TextToBytes = byteArray
        |End Function
        |
        |' Функция для сохранения ответа в файл
        |Sub SaveResponseToFile(responseText, filePath)
        |    Dim fileStream
        |    Set fileStream = CreateObject(""ADODB.Stream"")
        |    fileStream.Type = 2 ' Тип текстовых данных
        |    fileStream.Charset = ""utf-8"" ' Указываем кодировку
        |    fileStream.Open
        |    fileStream.WriteText responseText
        |    fileStream.SaveToFile filePath, 2 ' 2 = Создать новый файл или перезаписать
        |    fileStream.Close
        |    Set fileStream = Nothing
        |End Sub
        |";
        ScrCtrl.AddCode (Скрипт);
        Состояние("Выполнение скрипта на отправку файла обновления...");
        Возврат ScrCtrl.Run("Send");
    Исключение
        Сообщить("Строка с ошибкой: "+ScrCtrl.Error.Text);
        Сообщить("Error.Number: "+ScrCtrl.Error.Number);
        Сообщить("Error.Description: "+ScrCtrl.Error.Description);
        Сообщить("Error.Line: "+ScrCtrl.Error.Line);
        Сообщить("Error.Column: "+ScrCtrl.Error.Column);
        Сообщить("Error.Source: "+ScrCtrl.Error.Source);
        Возврат ОписаниеОшибки();
    КонецПопытки;
КонецФункции
Показать


Затык был в этих строках firmID="+ИдентификаторФирмы+" testMode="+Тестовый, непонятно куда их надо было подставлять. Данная функция полностью рабочая, но есть небольшое такое НО. Файл размером 690 Мб не смог обработать, вывалился с ошибкой о нехватке памяти.
Если кто знает каким другим способом выгрузить, подскажите. Где-то встречал что можно в поток выгружать не весь файл, а частями, где видел не помню. Подскажите.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот