Соединение = Новый HTTPСоединение(АдресСервера,, КодПользователя, Пароль,);
Возврат Соединение;
Пытаемся получить файл:
Попытка
Соединение.Получить(Адрес, ЛокальныйПуть);
Исключение
Возврат "Ошибка получения файла: "+ОписаниеОшибки();
КонецПопытки;
Дело в том, что работает такая конструкция, если Адрес = "1c/Accounting/3_0_39_67/1cv8.zip", даже если ничего не меняя в коде подставляю в переменную Адрес например "get/Info/Accounting/3_0_39_67/updsetup.exe", то ошибка:
Неудача: Ошибка получения файла: {ОбщийМодуль.Сервера1С.Модуль}: Ошибка при вызове метода контекста (Получить): Ошибка доступа к файлу 'get/Info/Accounting/3_0_37_36/updsetup.exe': Ошибка работы с Интернет: доступ запрещен.
<ht ml>
<head><title>403 Forbidden</title></head>
<body>
<h1>403 Forbidden</h1>
</body>
</html>
: Ошибка работы с Интернет: доступ запрещен (403)
Показать
И вот что интересно, если захожу на портал 1С, на страницу, где уже висит ссылка непосредственно на это обновление, тогда конфигурация успешно качает, и так для каждого релиза.
Подскажите в чём может быть причина и как исправить?
Если дело в сессиях, то как их использовать? Может сначала инициировать "заход" на страницу со ссылкой, и затем используя сессию этого соединения пытаться скачать файл? Ну это так, мысли вслух.
(5) Xershi, в том то и дело, что типовой код скачивает непосредственно zip-архив с шаблоном *.cfu
А мне надо скачать самораспаковывающийся архив, для установки этого шаблона
Ну судя по 403 ошибке - проблема в авторизации. Вы заходите, вводите (или браузер вводит за вас) логин и пароль, создается сессия. В рамках этой сессии вам предоставляется доступ. Потом сессия зарывается и всё. Однако, мне непонятно вот что. Сессия создается "для браузера", через куки. Почему тогда авторизация через браузер открывает доступ для 1с? Но здесь есть мысль. Адрес изначальной ссылки идет через https т.е. через защищенное соединение, там происходит авторизация и формируется (или "открывается") уже собственно ссылка на закачку файла. Возможно ссылка становится доступной для конкретного ip и тогда все логично. В любом случаи, мне кажется, нужно копать в сторону авторизации при запросе файла. Например, передавать логин и пароль через get или еще как-то....
когда пытаюсь скачать с сайта у меня тоже 403 Forbidden
и вот что мне ответило 1С:
Добрый день!
Причина в следующем:
Ваши запросы идут через прокси-сервера Вашего провайдера, причем IP-адреса изменяются динамически. Т.е. авторизация прошла с одного IP, а при скачивании обновления у Вас другой IP-адрес.
Поскольку система контроля доступа к релизам использует информацию об IP-адресе, Ваш запрос на дистрибутив не пропускается.
Для решения этой проблемы Вам необходимо либо потребовать от своего провайдера прямой доступ к сети (минуя прокси-сервера), либо попробовать сменить провайдера.
(10) cassper, спасибо, почитал. К сожалению снова речь о cf или cfu, но ни слова об архивах exe для установки шаблона. Мне необходимо скачать именно самораспаковывающийся архив, чтобы в дальнейшем можно было установить шаблон.
(13) markovki, Чтобы придумать какой-то "умный метод" надо знать как работает система. Как я понимаю, API, как такового, нет, а значит надо искать обходные пути. Я не знаю управляемые у вас формы или обычные, есть вариант для обычных. Чисто теория, т.к. протестировать сейчас нет возможности.
1. Заходим через IE (это важно) на https://login.1c.ru. Выполняем авторизацию, не забыв указать галку "запомнить меня".
2. В обычных формах можно было создать обработку-браузер. Это обычная обработка, с элементом Поле html документа. Назовем элемент "ОкноБраузера".
3. В обработке пишем такой код:
Процедура ПриОткрытии ()
ЭлементыФормы.ОкноБраузера.Перейти("https://login.1c.ru");
// Дадим 10 сек. на открытие ссылки.
Предупреждение("Эта форма закроется сама!",10,);
ЭтаФормаЗакрыть();
КонецПроцедуры
4. Перед началом выполнения вашего кода пишем:
ОткрытьФорму("Обработки.Браузер.ФормаЭлемента");
Суть идеи такова, что поле HTML документа базируется на движке IE. Соответственно ссылка будет обработана именно IE с учетом его куков (мы же ставили галку "запомнить"). Вы пройдете авторизацию, создаться сессия для IP и вперед.
(14) Serega-artem, Как раз сейчас копаю примерно в этом же направлении, пытаюсь открыть страницу в браузере, в том числе используя COMОбъект. Не удается залогиниться. Пока вопрос открыт. Если можно как-то это сделать именно, через COMОбъект, то и проблема решилась бы
(19) markovki, Вы меня немного не поняли (или я вас))) ). Имелось ввиду, что надо зайти один раз, сохранить пароль в куки и дальше в теории должно было работать автоматически. В любом случаи, метод предложенный foxey более надежный!
Перем ЭтоПервыйПоказСтраницы;
Процедура ПриОткрытии()
ЭтоПервыйПоказСтраницы = Истина;
АдреснаяСтрока = "https://login.1c.ru";
ЭлементыФормы.ПолеHTML.Перейти(АдреснаяСтрока);
КонецПроцедуры
Процедура ПолеHTMLДокументСформирован(Элемент)
ТекстДокумента = ЭлементыФормы.ПолеHTML.ПолучитьТекст();
Если Найти(ТекстДокумента, "Личные данные") > 0 И ЭтоПервыйПоказСтраницы Тогда
// Это нужная страничка открылась... Найдем элемент HTML с логином и паролем, заполним их и нажмем кнопочку отправки формы на сервер.
ЭтоПервыйПоказСтраницы = Ложь;
ЭлементыФормы.ПолеHTML.Документ.all("username").value = "user_name";
ЭлементыФормы.ПолеHTML.Документ.all("password").value = "Pass";
ЭлементыФормы.ПолеHTML.Документ.all("loginForm").submit();
КонецЕсли;
КонецПроцедуры
Показать
Т.е. на форме элемент ПолеHTMLДокумента и событие ДокументСформирован у него отлавливаем. Флажок ЭтоПервыйПоказСтраницы нужен для избавления от рекурсии.
(22) foxey, Спасибо за комментарий!!! Используя ваш пример сделал переход по 4-м ссылкам и СРАБОТАЛО!!!! Файл после исполнения кода начал загружаться.
Единственный нюанс: Следующая страница пытается загрузиться, не дождавшись загрузки предыдущей, из-за этого в тестовом режиме раскидал переходы на следующие страницы по кнопкам.
Отсюда вопрос, есть ли возможность дождаться загрузки страницы и только после этого выполнять код дальше?
(23) А можно Ваш код посмотреть. Интересно, что там за переходы на страницы срабатывают...
Пробовал повоевать с другими флажками, чтобы уйти от трехкратного срабатывания события ДокументСформирован - не получилось.
Перем КнопкуЛогинаЕщеНеНажимали;
Процедура ПриОткрытии()
КнопкуЛогинаЕщеНеНажимали = Истина;
АдреснаяСтрока = "https://login.1c.ru";
ЭлементыФормы.ПолеHTML.Перейти(АдреснаяСтрока);
КонецПроцедуры
Процедура ПолеHTMLДокументСформирован(Элемент)
ТекстДокумента = ЭлементыФормы.ПолеHTML.ПолучитьТекст();
Сообщить("onload:"+ЭлементыФормы.ПолеHTML.document.readyState);
Если Найти(ТекстДокумента, "Личные данные") > 0 И КнопкуЛогинаЕщеНеНажимали Тогда
// Это нужная страничка открылась... Найдем элемент HTML с логином и паролем, заполним их и нажмем кнопочку отправки формы на сервер.
КнопкуЛогинаЕщеНеНажимали = Ложь;
ЭлементыФормы.ПолеHTML.Документ.all("username").value = "user_name";
ЭлементыФормы.ПолеHTML.Документ.all("password").value = "Pass";
ЭлементыФормы.ПолеHTML.Документ.all("loginForm").submit();
Сообщить("Нажимаем сабмит...");
КонецЕсли;
КонецПроцедуры
Показать
Флаг ReadyState документа соответствует событию ДокументСформирован и равен "complete" в нашем обработчике. Короче, надо код глянуть. Если еще актуально, конечно же.
Пауза(Время) - пытался выполнить задержку исполнения кода - безрезультатно.
В итоге сделал кнопки на форме, для перехода по страницам т.е. в первой кнопке срабатывало:
(25)Имена полей посмотрел в исходнике страницы. Загрузил login.1c.ru в браузер, потом правым мышом - Просмотр кода страницы, ну а дальше - дело внимательности и знания HTML.
Процедура ПолеHTMLДокументСформирован(Элемент)
ТекстДокумента = ЭлементыФормы.ПолеHTMLДокумента.ПолучитьТекст();
Если Найти(ТекстДокумента, "Личные данные") > 0 И ЭтоПервыйПоказСтраницы Тогда
// Это нужная страничка открылась... Найдем элемент HTML с логином и паролем, заполним их и нажмем кнопочку отправки формы на сервер.
ЭтоПервыйПоказСтраницы = Ложь;
ЭлементыФормы.ПолеHTMLДокумента.Документ.all("username").value = login;
ЭлементыФормы.ПолеHTMLДокумента.Документ.all("password").value = pass;
ЭлементыФормы.ПолеHTMLДокумента.Документ.all("loginForm").submit();
КонецЕсли;
КонецПроцедуры