При автоматизации обновления конфигураций или мониторинге выхода новых версий программисты часто сталкиваются с необходимостью программного доступа к порталу releases.1c.ru. Однако простая попытка получить тело страницы через обычный GET-запрос часто оборачивается неудачей: вместо ожидаемого HTML-кода возвращается пустая строка или код состояния 302. Разберем подробно, почему это происходит и как правильно организовать получение данных с этого ресурса.
Для начала рассмотрим базовую структуру кода, которая необходима для работы с защищенным ресурсом. Портал 1С работает исключительно по протоколу HTTPS, поэтому нам обязательно потребуется объект ЗащищенноеСоединениеOpenSSL. Если попытаться создать соединение без него, сервер просто сбросит попытку подключения.
Проанализируем стандартную конструкцию запроса:
Логин = "ВашЛогин";
Пароль = "ВашПароль";
Сервер = "releases.1c.ru";
// Создаем защищенное соединение
Защита = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, , Логин, Пароль, , , Защита);
// Формируем запрос к конкретной странице (например, проект ЗУП 3.0)
Запрос = Новый HTTPЗапрос("/project/HRM30");
// Получаем ответ
Ответ = Соединение.Получить(Запрос);
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
Как отмечают участники обсуждения, даже при правильном синтаксисе вы можете получить пустую строку. Это происходит из-за того, что сервер ожидает определенные заголовки или перенаправляет вас на страницу авторизации.
Выясним причину, по которой СтрокаОтвета оказывается пустой. Если после выполнения метода Получить() проверить свойство Ответ.КодСостояния, мы часто увидим значение 302. Это код временного перенаправления (редиректа).
В отличие от обычных браузеров, объект HTTPСоединение в 1С не переходит по ссылке автоматически. Нам нужно сделать это вручную. Рассмотрим алгоритм обработки редиректа:
Location.Важно помнить, что портал 1С использует сложную цепочку перенаправлений (иногда до 3–4 шагов), прежде чем отдать конечный контент. На каждом этапе сервер проверяет вашу авторизацию и может устанавливать куки (Cookies).
Проанализируем ситуацию с авторизацией. Сайт releases.1c.ru тесно связан с системой login.1c.ru. Когда вы запрашиваете страницу, сервер проверяет наличие сессионной куки. Если ее нет, он «отфутболивает» вас на форму входа.
Чтобы успешно «пробиться» к тексту страницы, необходимо реализовать механизм сохранения сессии:
1. Передача Cookies. Каждый раз, когда сервер присылает заголовок Set-Cookie, вы должны сохранить эти данные и передать их в следующем запросе в заголовке Cookie. Без этого сервер «забудет», что вы только что ввели логин и пароль.
2. Использование User-Agent. Многие современные веб-серверы блокируют запросы, которые выглядят как работа «бота». Чтобы запрос выглядел как исходящий от обычного браузера, обязательно добавьте заголовок User-Agent. Рассмотрим пример:
Запрос = Новый HTTPЗапрос("/project/HRM30");
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
// Теперь сервер будет считать нас обычным пользователем
Если ваша конфигурация построена на базе БСП (а это почти все современные решения: ЗУП 3.1, БП 3.0, ERP), мы рекомендуем не изобретать велосипед с низкоуровневыми HTTP-запросами. В БСП есть готовые механизмы, которые умеют обрабатывать редиректы и работать с прокси-серверами.
Обратите внимание на общий модуль ПолучениеФайловИзИнтернета. Его методы позволяют скачивать данные гораздо проще, так как многие рутинные операции (обработка ошибок соединения, таймауты) уже реализованы внутри подсистемы.
Разберем еще один практичный совет. Парсинг HTML-страницы — занятие неблагодарное, так как верстка сайта может измениться в любой момент, и ваш код перестанет работать. Однако у портала 1С есть механизмы для программного получения списков релизов.
Вместо того чтобы имитировать действия пользователя на странице /project/HRM30, попробуйте обратиться к ресурсу https://releases.1c.ru/total. Этот адрес часто отдает структурированную информацию, которую гораздо легче обработать с помощью объекта ЧтениеXML или ЧтениеJSON.
Пример обработки структурированных данных:
// Предположим, мы получили XML данные со списком релизов
Чтение = Новый ЧтениеXML;
Чтение.УстановитьСтроку(СтрокаОтвета);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "v8:version" Тогда
НомерРелиза = Чтение.ПрочитатьАтрибут("number");
// Здесь можно сравнить номер релиза и найти актуальный
КонецЕсли;
КонецЦикла;
Как отмечалось в обсуждении, иногда нужно найти номер релиза ветки, которая официально считается устаревшей или заменяемой. В этом случае прямые ссылки могут вести на страницы-заглушки. Проанализируем структуру URL: иногда достаточно изменить идентификатор проекта в строке запроса (например, с HRM30 на архивные разделы), чтобы получить доступ к истории обновлений.
Резюмируем последовательность действий для успешного получения текста:
ЗащищенноеСоединениеOpenSSL.User-Agent в заголовки.Location).Такой системный подход позволит вам стабильно получать информацию о релизах, не опасаясь блокировок или пустых ответов от сервера.