Как исправить ошибку перевода номенклатуры через Yandex.Translate API в 1С?

Программист 1С v8.3 (Обычные формы)
← На главную

При автоматизации перевода справочника номенклатуры программисты 1С часто сталкиваются с ситуацией, когда старые, годами работавшие обработки внезапно перестают возвращать текст. Вместо ожидаемого перевода в программу загружается служебное сообщение: "Yandex.Translate API documentation can be found here...", а отладчик фиксирует ошибку 404 или 403. Разберем детально, почему это происходит и как адаптировать код под современные требования сервисов перевода.

Выясняем причину: почему старый код перестал работать?

Проанализируем ситуацию. Основная причина кроется в том, что компания Яндекс полностью прекратила поддержку устаревшего API версии 1.5. Раньше для перевода достаточно было отправить простой GET-запрос, передав ключ и текст прямо в адресной строке. Теперь сервис переехал в Yandex Cloud. Это повлекло за собой три критических изменения:

  1. Смена адреса: Вместо translate.yandex.net/api/v1.5... теперь используется translate.api.cloud.yandex.net/translate/v2/translate.
  2. Метод передачи данных: Использование метода GET больше не поддерживается для передачи текста. Необходимо использовать POST-запрос с телом в формате JSON.
  3. Авторизация: Простые API-ключи старого образца отключены. Теперь требуется создание платежного аккаунта в облаке, сервисного аккаунта и получение IAM-токена или статического ключа API через консоль Yandex Cloud.

Шаг 1: Подготовка инфраструктуры в Yandex Cloud

Прежде чем приступать к написанию кода в 1С, нам необходимо получить актуальные данные для авторизации. Рассмотрим этот процесс по шагам:

  1. Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт (для новых пользователей часто предоставляется пробный период).
  2. Создайте каталог (folder) и запишите его ID — он понадобится в каждом запросе.
  3. Создайте сервисный аккаунт и выпустите для него API-key.

Шаг 2: Реализация нового HTTP-запроса на языке 1С

Теперь перейдем к технической части. Нам необходимо сформировать 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 для корректного формирования тела запроса. Это критически важно, так как спецсимволы в наименованиях номенклатуры (кавычки, слеши) должны быть правильно экранированы, иначе сервис вернет ошибку формата.

Шаг 3: Оптимизация — пакетный перевод номенклатуры

Проанализируем ситуацию со скоростью работы. Если в справочнике номенклатуры 10 000 позиций, отправка отдельного HTTP-запроса для каждой строки займет огромное количество времени из-за накладных расходов на установку SSL-соединения. Современное API позволяет передавать массив строк в одном запросе.

Рекомендуемый алгоритм:

  1. Соберите наименования номенклатуры в массив (например, по 50-100 штук).
  2. Передайте этот массив в поле texts объекта JSON.
  3. Получите в ответе массив translations и распределите переведенные значения обратно по элементам справочника.

Рассмотрим, как изменить формирование массива текстов:


// Вместо одной строки добавляем несколько
МассивТекста = Новый Массив;
Для Каждого СтрокаНоменклатуры Из СписокДляПеревода Цикл
    МассивТекста.Добавить(СтрокаНоменклатуры.Наименование);
КонецЦикла;
ДанныеЗапроса.Вставить("texts", МассивТекста);

Альтернативные варианты решения задачи

Если работа с Yandex Cloud кажется избыточной или возникают сложности с оплатой, рассмотрим альтернативные пути, которые часто обсуждаются в сообществе 1С:

  1. Google Translate API: Работает по схожему принципу (POST, JSON), но требует регистрации в Google Cloud Console. Качество перевода технических терминов традиционно на высоком уровне.
  2. Использование нейросетей (GPT): Современный тренд. С помощью API от OpenAI или YandexGPT можно не просто переводить, а "причесывать" номенклатуру: исправлять сокращения, приводить к единому регистру. Например, превратить "Болт М10х20 цинк." в корректное "Bolt M10x20 zinc plated".
  3. DeepL API: Считается лучшим по качеству перевода для европейских языков, однако имеет строгие ограничения по доступу из некоторых регионов.

Важные замечания по безопасности и стабильности

При работе с внешними сервисами из 1С не забывайте о следующих моментах:

Таким образом, для восстановления работоспособности перевода в 1С необходимо отказаться от устаревших GET-запросов версии 1.5, перейти на структуру JSON и настроить авторизацию через Yandex Cloud. Это обеспечит стабильную работу системы и позволит использовать все преимущества современных технологий машинного перевода.

← На главную