Как реализовать автоматический перевод текста через Google Translate в 1С и обойти ошибку 302 Moved?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разработка механизмов автоматического перевода внутри учетных систем 1С — задача довольно востребованная, особенно в конфигурациях, работающих с международными справочниками номенклатуры или внешними заказами. Однако при попытке «в лоб» получить текст перевода путем парсинга страницы translate.google.com разработчики часто сталкиваются с техническими преградами: от ошибок перенаправления (302 Moved) до получения пустого HTML-кода без самого результата перевода. В этой статье мы детально разберем, почему стандартный подход с парсингом тегов не работает, и рассмотрим эффективные альтернативы.

Разбор причины ошибки «302 Moved» и важность защищенного соединения

Первая проблема, с которой сталкивается программист при отправке запроса к Google — получение статуса ответа 302 Moved Temporarily. Разберем ситуацию: этот код состояния означает, что запрашиваемый ресурс временно находится по другому адресу. В контексте сервисов Google это чаще всего связано с автоматическим перенаправлением с протокола HTTP на HTTPS или с одного регионального домена на другой (например, с .ru на .com).

Для корректной работы в 1С при создании объекта HTTPСоединение мы обязательно должны использовать защищенное соединение. В современных версиях платформы 1С:Предприятие 8.3 это реализуется через объект ЗащищенноеСоединениеOpenSSL. Если не инициализировать этот параметр, сервер Google будет постоянно «отфутболивать» запрос, пытаясь перевести сессию в защищенный режим.

Рассмотрим правильный способ инициализации соединения:


// Определяем настройки защищенного соединения
СертификатыУдостоверяющихЦентров = Новый СертификатыУдостоверяющихЦентровWindows();
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, СертификатыУдостоверяющихЦентров);

// Создаем соединение с указанием защищенного протокола
HTTPСервис = Новый HTTPСоединение("translate.google.com", 443, , , , 30, ЗащищенноеСоединение);

Почему парсинг HTML-кода основной страницы обречен на провал

Даже если мы успешно обойдем редиректы и получим тело страницы (код 200 OK), мы обнаружим, что в тексте HTML-документа нет переведенного слова. Проанализируем архитектуру современного Google Переводчика: это так называемое SPA (Single Page Application). При открытии ссылки в браузере сначала загружается тяжелый каркас из JavaScript-скриптов и CSS-стилей, и только потом, через фоновые AJAX-запросы, браузер обращается к серверному API за самим переводом.

Метод HTTPСоединение.Получить() в 1С не является браузером — он не исполняет JavaScript. Он просто скачивает статический код. Именно поэтому попытки использовать ПостроительDOM или ЧтениеHTML для поиска нужного тега с результатом перевода бесполезны — этого текста просто нет в исходном коде страницы в момент загрузки.

Решение через «недокументированный» API (клиент gtx)

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

Для реализации нам потребуется сформировать GET-запрос к адресу translate.googleapis.com/translate_a/single. Ключевым параметром здесь является client=gtx, который позволяет выполнять простые запросы без необходимости сложной генерации токенов безопасности.

Разберем по шагам создание функции перевода:

  1. Подготавливаем текст: он должен быть закодирован в формат URL (Percent-encoding).
  2. Формируем параметры запроса: исходный язык (sl), целевой язык (tl) и тип данных (dt=t).
  3. Отправляем запрос и разбираем JSON-массив.

Функция ПолучитьПереводТекста(ИсходныйТекст, ЯзыкС, ЯзыкНа)
    
    Домен = "translate.googleapis.com";
    // Кодируем текст для передачи в URL
    ТекстURL = КодироватьСтроку(ИсходныйТекст, СпособКодированияСтроки.КодированиеURL);
    
    ЗапросТекст = "/translate_a/single?client=gtx&sl=" + ЯзыкС + "&tl=" + ЯзыкНа + "&dt=t&q=" + ТекстURL;
    
    // Настройка соединения (обязательно HTTPS)
    Защита = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение = Новый HTTPСоединение(Домен, 443, , , , 15, Защита);
    
    Запрос = Новый HTTPЗапрос(ЗапросТекст);
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
        Если Ответ.КодСостояния = 200 Тогда
            // Google возвращает специфический массив массивов
            ЧтениеJSON = Новый ЧтениеJSON;
            ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
            Данные = ПрочитатьJSON(ЧтениеJSON);
            ЧтениеJSON.Закрыть();
            
            // Результат обычно находится в первом элементе
            Попытка
                Возврат Данные[0][0][0];
            Исключение
                Возврат "Ошибка структуры данных";
            КонецПопытки;
        Иначе
            Возврат "Ошибка сервера: " + Ответ.КодСостояния;
        КонецПопытки;
    Исключение
        Возврат "Ошибка связи: " + ОписаниеОшибки();
    КонецПопытки;
    
КонецФункции

Борьба с блокировками и использованием заголовков

Если мы планируем переводить большие объемы данных (например, тысячи карточек товаров), Google быстро распознает в нас бота и заблокирует IP-адрес, выдав капчу. Выясним, как сделать наш запрос более «человекоподобным».

Использование User-Agent. По умолчанию 1С не передает заголовок User-Agent, либо передает свой собственный. Серверы Google сразу видят, что запрос идет не из браузера. Нам необходимо добавить заголовок, имитирующий популярный браузер (Chrome или Firefox).

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

Пример добавления заголовков в запрос:


Запрос = Новый HTTPЗапрос(ЗапросТекст);
Запрос.Заголовки.Вставить("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");
Запрос.Заголовки.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");

Альтернативные варианты: почему API Яндекса или DeepL может быть лучше

Проанализируем ситуацию: стоит ли тратить время на поддержку «бесплатного» парсинга Google, который может сломаться в любой момент при изменении алгоритмов защиты? Профессиональное решение подразумевает использование официальных API.

  1. Yandex.Translate API: Долгое время был фаворитом для российских разработчиков 1С из-за простоты интеграции и качественного перевода технических терминов. Работает через простой POST-запрос с ключом API.
  2. DeepL API: На данный момент считается лидером по качеству машинного перевода. У DeepL есть бесплатный тариф (до 500 000 символов в месяц), чего часто достаточно для нужд небольшой компании. Интеграция в 1С аналогична работе с Google через JSON.
  3. Локальные решения (LibreTranslate): Если безопасность данных критична и нельзя отправлять тексты на внешние серверы, можно развернуть собственный сервер перевода LibreTranslate (внутри сети компании) и обращаться к нему из 1С без ограничений и лимитов.

Подводя итог, можно сказать: прямой парсинг HTML-страницы Google Translate — это тупиковый путь для 1С. Рациональнее использовать либо скрытые эндпоинты (как в примере с client=gtx), либо переходить на официальные API-сервисы, которые обеспечивают стабильность работы вашей системы.

← На главную