При автоматизации перевода справочника номенклатуры программисты 1С часто сталкиваются с ситуацией, когда старые, годами работавшие обработки внезапно перестают возвращать текст. Вместо ожидаемого перевода в программу загружается служебное сообщение: "Yandex.Translate API documentation can be found here...", а отладчик фиксирует ошибку 404 или 403. Разберем детально, почему это происходит и как адаптировать код под современные требования сервисов перевода.
Проанализируем ситуацию. Основная причина кроется в том, что компания Яндекс полностью прекратила поддержку устаревшего API версии 1.5. Раньше для перевода достаточно было отправить простой GET-запрос, передав ключ и текст прямо в адресной строке. Теперь сервис переехал в Yandex Cloud. Это повлекло за собой три критических изменения:
translate.yandex.net/api/v1.5... теперь используется translate.api.cloud.yandex.net/translate/v2/translate.GET больше не поддерживается для передачи текста. Необходимо использовать POST-запрос с телом в формате JSON.IAM-токена или статического ключа API через консоль Yandex Cloud.Прежде чем приступать к написанию кода в 1С, нам необходимо получить актуальные данные для авторизации. Рассмотрим этот процесс по шагам:
ID — он понадобится в каждом запросе.Теперь перейдем к технической части. Нам необходимо сформировать JSON, содержащий целевой язык, список строк для перевода и идентификатор нашего каталога. Посмотрим на пример реализации функции перевода с использованием объекта HTTPЗапрос.
Функция ПеревестиТекстЯндексОблако(ТекстДляПеревода, APIКлюч, ИдентификаторКаталога)
Результат = "";
// 1. Формируем структуру тела запроса
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("folderId", ИдентификаторКаталога);
ДанныеЗапроса.Вставить("targetLanguageCode", "en"); // Например, на английский
МассивТекста = Новый Массив;
МассивТекста.Добавить(ТекстДляПеревода);
ДанныеЗапроса.Вставить("texts", МассивТекста);
// 2. Сериализуем структуру в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
// 3. Настраиваем соединение
Сервер = "translate.api.cloud.yandex.net";
Ресурс = "/translate/v2/translate";
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер, 443,,,,, SSL);
// 4. Формируем POST-запрос
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Authorization", "Api-Key " + APIКлюч);
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Попытка
Ответ = Соединение.ОтправитьДляОбъекта(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Разбираем ответ
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
ДанныеОтвета = ПрочитатьJSON(ЧтениеJSON);
Если ДанныеОтвета.Свойство("translations") И ДанныеОтвета.translations.Количество() > 0 Тогда
Результат = ДанныеОтвета.translations[0].text;
КонецЕсли;
Иначе
Сообщить("Ошибка API: " + Ответ.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Ошибка связи: " + ОписаниеОшибки());
КонецПопытки;
Возврат Результат;
КонецФункции
Разберем, что изменилось по сравнению со старым кодом из вопроса автора. Мы использовали объект ЗаписьJSON для корректного формирования тела запроса. Это критически важно, так как спецсимволы в наименованиях номенклатуры (кавычки, слеши) должны быть правильно экранированы, иначе сервис вернет ошибку формата.
Проанализируем ситуацию со скоростью работы. Если в справочнике номенклатуры 10 000 позиций, отправка отдельного HTTP-запроса для каждой строки займет огромное количество времени из-за накладных расходов на установку SSL-соединения. Современное API позволяет передавать массив строк в одном запросе.
Рекомендуемый алгоритм:
texts объекта JSON.translations и распределите переведенные значения обратно по элементам справочника.Рассмотрим, как изменить формирование массива текстов:
// Вместо одной строки добавляем несколько
МассивТекста = Новый Массив;
Для Каждого СтрокаНоменклатуры Из СписокДляПеревода Цикл
МассивТекста.Добавить(СтрокаНоменклатуры.Наименование);
КонецЦикла;
ДанныеЗапроса.Вставить("texts", МассивТекста);
Если работа с Yandex Cloud кажется избыточной или возникают сложности с оплатой, рассмотрим альтернативные пути, которые часто обсуждаются в сообществе 1С:
При работе с внешними сервисами из 1С не забывайте о следующих моментах:
429 (Too Many Requests). Используйте команду Приостановить(1) или обрабатывайте этот код ответа.API-key прямо в коде. Используйте для этого константы или защищенные параметры сеанса, доступные только администратору.Таким образом, для восстановления работоспособности перевода в 1С необходимо отказаться от устаревших GET-запросов версии 1.5, перейти на структуру JSON и настроить авторизацию через Yandex Cloud. Это обеспечит стабильную работу системы и позволит использовать все преимущества современных технологий машинного перевода.