При автоматизации бизнес-процессов в 1С часто возникает необходимость перевода текстовых данных. Это может быть перевод наименований номенклатуры для зарубежных поставщиков, локализация описаний товаров для интернет-магазинов или обработка входящих спецификаций. Официальный Google Cloud Translation API является платным сервисом и требует привязки банковской карты, что не всегда удобно или возможно.
Многие разработчики пытаются использовать прямые HTTP-запросы к публичному веб-интерфейсу Google Переводчика. Однако при этом они неизбежно сталкиваются с техническими трудностями: ошибками форматирования запроса (Ошибка 400 Bad Request) или мгновенной блокировкой со стороны защитных систем Google (требование ввода капчи). В этой статье мы подробно разберем, почему возникают эти проблемы, проанализируем ошибки из обсуждения на форуме и рассмотрим несколько надежных, бесплатных и стабильных способов реализации перевода непосредственно из кода 1С.
Для начала проанализируем ситуацию, с которой столкнулся автор темы. Попытка отправить классический GET-запрос по адресу translate.google.ru/translate_a/t мгновенно приводит к ошибкам. Выделим три ключевые причины, почему этот подход не работает из кода 1С, хотя прекрасно открывается в обычном веб-браузере:
text="Добрый день") недопустима. Стандарты HTTP требуют, чтобы любые спецсимволы и национальные алфавиты преобразовывались в процентную кодировку (процент-эскейпинг). Без этого сервер Google возвращает ошибку 400.HTTPСоединение важно четко разделять адрес сервера (хост) и путь к конкретному скрипту. Передача полной ссылки в параметры подключения является грубой синтаксической ошибкой.Перейдем к рассмотрению готовых и стабильных решений, которые позволяют обойти эти ограничения легальными и надежными методами.
Наиболее простой и стабильный способ отправки прямого HTTP-запроса — это использование недокументированного, но открытого API, разработанного Google для браузерных расширений (например, для Google Translate Chrome Extension). Этот эндпоинт гораздо лояльнее относится к автоматическим запросам, не требует сложной авторизации и практически не блокируется капчей при умеренной интенсивности обращений.
Рассмотрим подробный пример реализации функции перевода на платформе 1С v8.3 с использованием защищенного SSL-соединения и обязательным кодированием входящего текста.
&НаСервере
Функция ВыполнитьПереводТекстаGTX(Знач ИсходныйТекст, Знач КодЯзыкаОтправителя = "ru", Знач КодЯзыкаПолучателя = "en") Экспорт
// Проверим входной текст на пустоту
Если ПустаяСтрока(ИсходныйТекст) Тогда
Возврат "";
КонецЕсли;
// Шаг 1. Настройка параметров подключения
// Обратите внимание, что хост указывается без префикса "https://"
ИмяСервера = "translate.googleapis.com";
// Шаг 2. Кодирование текста в формат URL-encoded (UTF-8)
// Это критически важно для работы с кириллицей!
ЗакодированныйТекст = КодироватьСтроку(ИсходныйТекст, СпособКодированияСтроки.КодировкаURL);
// Формируем путь к ресурсу. Параметр dt=t указывает на необходимость возврата только перевода текста.
ПутьРесурса = "/translate_a/single?client=gtx&dt=t&sl="
+ КодЯзыкаОтправителя
+ "&tl=" + КодЯзыкаПолучателя
+ "&q=" + ЗакодированныйТекст;
// Шаг 3. Инициализация защищенного соединения SSL
// Google работает исключительно по протоколу HTTPS
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(ИмяСервера, , , , , 30, ЗащищенноеСоединение);
// Шаг 4. Подготовка HTTP-запроса и эмуляция заголовков браузера (User-Agent)
Запрос = Новый HTTPЗапрос(ПутьРесурса);
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36");
Запрос.Заголовки.Вставить("Accept", "application/json");
Попытка
// Отправляем запрос на сервер
ОтветСервера = Соединение.Получить(Запрос);
Если ОтветСервера.КодСостояния = 200 Тогда
// Извлекаем тело ответа, которое возвращается в кодировке UTF-8
СтрокаJSON = ОтветСервера.ПолучитьТелоКакСтроку("UTF-8");
Возврат РазобратьJSONРезультатПеревода(СтрокаJSON);
Иначе
ЗаписьЖурналаРегистрации("Интеграция.GoogleTranslate",
УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось получить перевод. Код состояния сервера: " + ОтветСервера.КодСостояния);
Возврат "Ошибка сервера: " + ОтветСервера.КодСостояния;
КонецЕсли;
Исключение
// Логируем возможные сетевые сбои
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("Интеграция.GoogleTranslate",
УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
Возврат "Сетевая ошибка при выполнении перевода";
КонецПопытки;
КонецФункции
Для корректного извлечения текста нам необходимо десериализовать полученный ответ. Сервер возвращает сложную вложенную структуру массивов JSON. Разберем по шагам функцию парсинга ответа:
&НаСервере
Функция РазобратьJSONРезультатПеревода(Знач СтрокаJSON)
// Инициализируем стандартное чтение JSON в 1С
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Попытка
Данные = ПрочитатьJSON(Чтение);
Исключение
Чтение.Закрыть();
Возврат "Ошибка разбора JSON";
КонецПопытки;
Чтение.Закрыть();
// Структура ответа от Google GTX представляет собой многомерный массив.
// Перевод первой строки всегда находится по пути: Данные[0][0][0]
Результат = "";
Если ТипЗнч(Данные) = Тип("Массив") И Данные.Количество() > 0 Тогда
МассивПереводов = Данные[0];
Если ТипЗнч(МассивПереводов) = Тип("Массив") Тогда
Для Каждого ЭлементПеревода Из МассивПереводов Цикл
Если ТипЗнч(ЭлементПеревода) = Тип("Массив") И ЭлементПеревода.Количество() > 0 Тогда
Результат = Результат + Строка(ЭлементПеревода[0]);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат СокрЛП(Результат);
КонецФункции
Если вам необходим абсолютно надежный инструмент промышленного масштаба, который никогда не заблокирует ваш сервер 1С по IP-адресу, лучшим решением станет использование технологии Google Apps Script (GAS). Это облачная среда, которая позволяет выполнять скрипты на серверах Google.
Смысл метода заключается в следующем: мы пишем простейший скрипт из 5 строк внутри экосистемы Google. Этот скрипт использует внутренний официальный класс LanguageApp, который выполняет переводы абсолютно бесплатно и без лимитов. Мы публикуем этот скрипт как веб-приложение, а из 1С отправляем обычные GET-запросы к нашему собственному микросервису.
Рассмотрим по шагам процесс настройки этой связки:
function doGet(e) {
var text = e.parameter.text;
var source = e.parameter.source || 'ru';
var target = e.parameter.target || 'en';
try {
var translatedText = LanguageApp.translate(text, source, target);
return ContentService.createTextOutput(translatedText)
.setMimeType(ContentService.MimeType.TEXT);
} catch (error) {
return ContentService.createTextOutput("Error: " + error.toString())
.setMimeType(ContentService.MimeType.TEXT);
}
}
https://script.google.com/macros/s/УНИКАЛЬНЫЙ_ИДЕНТИФИКАТОР/exec).Теперь напишем процедуру отправки запроса к нашему прокси-серверу из 1С. Важно учитывать, что при обращении к скриптам Google всегда происходит HTTP-перенаправление (код состояния 302). Платформа 1С v8.3 автоматически обрабатывает редиректы при использовании правильных настроек.
&НаСервере
Функция ПеревестиЧерезGoogleAppsScript(Знач ИсходныйТекст, Знач ИдентификаторСкрипта) Экспорт
// Адрес хоста Google Scripts
Сервер = "script.google.com";
// Кодируем параметры запроса
ПараметрыЗапроса = "?text=" + КодироватьСтроку(ИсходныйТекст, СпособКодированияСтроки.КодировкаURL)
+ "&source=ru&target=en";
ПутьКЛогике = "/macros/s/" + ИдентификаторСкрипта + "/exec" + ПараметрыЗапроса;
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// Крайне важно включить поддержку перенаправлений!
// Платформа 1С автоматически последует за редиректом 302 на сервера хранения результатов Google User Content
Соединение = Новый HTTPСоединение(Сервер, , , , , 30, Защита);
Запрос = Новый HTTPЗапрос(ПутьКЛогике);
Запрос.Заголовки.Вставить("User-Agent", "1C+Enterprise+Application");
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Возврат Ответ.ПолучитьТелоКакСтроку("UTF-8");
Иначе
Возврат "Ошибка выполнения скрипта: " + Ответ.КодСостояния;
КонецЕсли;
Исключение
Возврат "Ошибка связи с Google Cloud";
КонецПопытки;
КонецФункции
Если вы работаете на устаревших версиях платформы (например, 1С v8.1, v8.2 или комплексных конфигурациях на обычных формах), где механизмы HTTPСоединение обладают ограниченным функционалом (отсутствует нативная поддержка SSL некоторых типов или нет удобной сериализации JSON), можно воспользоваться системным COM-объектом Windows.
Рассмотрим пример использования WinHttp.WinHttpRequest.5.1, в котором мы корректно обрабатываем cookies, имитируя сессию реального пользователя для снижения риска блокировки.
Функция ПеревестиТекстЧерезWinHttp(Знач ИсходныйТекст) Экспорт
// Создаем системный COM-объект для работы с сетевыми запросами
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Шаг 1. Первичный запрос к главной странице для получения сессионных куков
Попытка
WinHttp.Open("GET", "https://www.google.ru", Ложь);
WinHttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
WinHttp.Send();
// Попытаемся извлечь куки, если они возвращены сервером
ВсеКуки = "";
Попытка
ВсеКуки = WinHttp.GetResponseHeader("Set-Cookie");
Исключение
// Если заголовка нет, продолжаем без него
КонецПопытки;
Исключение
Возврат "Ошибка инициализации сессии WinHttp";
КонецПопытки;
// Шаг 2. Формирование основного запроса на перевод
ЗакодированныйТекст = КодироватьСтроку(ИсходныйТекст, СпособКодированияСтроки.КодировкаURL);
АдресЗапроса = "https://translate.googleapis.com/translate_a/single?client=gtx&dt=t&sl=ru&tl=en&q=" + ЗакодированныйТекст;
Попытка
WinHttp.Open("GET", АдресЗапроса, Ложь);
// Установка заголовков для максимальной имитации браузера
WinHttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
WinHttp.SetRequestHeader("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7");
WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
Если Не ПустаяСтрока(ВсеКуки) Тогда
WinHttp.SetRequestHeader("Cookie", ВсеКуки);
КонецЕсли;
WinHttp.Send();
Если WinHttp.Status = 200 Тогда
// Читаем сырой текст ответа
ОтветТекст = WinHttp.ResponseText;
Возврат РазборСтрокиДляСтарыхПлатформ(ОтветТекст);
Иначе
Возврат "Ошибка WinHttp. Код: " + WinHttp.Status;
КонецЕсли;
Исключение
Возврат "Критическая ошибка отправки запроса через WinHttp";
КонецПопытки;
КонецФункции
Функция РазборСтрокиДляСтарыхПлатформ(Знач СтрокаJSON)
// Упрощенный парсинг для старых версий 1С, где нет ЧтениеJSON.
// Так как нам нужно только первое значение внутри вложенных квадратных скобок: [[["Перевод","Оригинал"...]]]
ИндексНачала = Найти(СтрокаJSON, """");
Если ИндексНачала = 0 Тогда
Возврат "Не удалось распарсить ответ";
КонецЕсли;
// Вырезаем кусок после первой кавычки
ОстатокСтроки = Сред(СтрокаJSON, ИндексНачала + 1);
ИндексКонца = Найти(ОстатокСтроки, """");
Если ИндексКонца = 0 Тогда
Возврат "Неверный формат ответа";
КонецЕсли;
Возврат Сред(ОстатокСтроки, 1, ИндексКонца - 1);
КонецФункции
Какое бы техническое решение вы ни выбрали, всегда придерживайтесь следующих архитектурных правил при проектировании подсистем интеграции в 1С:
КэшПереводовGoogle с измерениями ИсходныйТекст (тип ХранилищеЗначения или Строка ограниченной длины с MD5-хэшем) и КодЯзыка, и ресурсом ПереведенныйТекст. Перед каждой отправкой запроса к Google проверяйте наличие перевода в локальной базе данных. Это сократит количество сетевых запросов на 80-90% и полностью исключит угрозу блокировки по IP.ПриостановитьРаботуПотока(1) или обработчиков ожидания. Оптимальная частота — не более 1-2 запросов в секунду.Попытка...Исключение, чтобы аварийное завершение работы веб-сервиса Google не приводило к прерыванию проведения документов или транзакций в 1С.