Записи звонков и встреч можно отправлять на расшифровку прямо из 1С. Транскрипта принимает аудиофайл по API, обрабатывает его в фоне и возвращает текст. В 1С остаётся сохранить номер задачи и связать готовую расшифровку с документом, клиентом или звонком.

В этой инструкции подключим API, отправим WAV-файл и получим текст обратно. Полные примеры кода можно скачать и добавить в свою обработку.

Что понадобится

  • 1С:Предприятие с поддержкой типов ПотокВПамяти, ЗаписьДанных и HTTPСоединение.
  • Аккаунт Транскрипты с платным тарифом и API-ключом с правами создания и чтения расшифровок.
  • Аудиофайл, доступный процессу 1С. Для первого запуска подойдёт короткий WAV-файл.
  • Доступ к API по HTTPS из среды, где выполняется код.

В примере используется прямая загрузка файла до 100 МиБ. Для более крупных записей есть загрузка по частям — она описана в общем руководстве по API.

Шаг 1. Создайте API-ключ

Раздел API в настройках Транскрипты

Откройте личный кабинет Транскрипты, перейдите в «Настройки» → «API» и нажмите «Создать ключ». Дайте ключу понятное название, например «1С: расшифровка звонков».

Создание ключа для интеграции

Сохраните ключ: полное значение показывается один раз. Там же откройте документацию и скопируйте адрес API. Для переменной APIХост в примере потребуется только имя хоста, без https:// и без пути. Соединение будет использовать HTTPS и порт 443.

Рабочий ключ храните в защищённых настройках на сервере. Значение в коде ниже — место для подстановки при первом тесте.

Шаг 2. Добавьте код отправки в 1С

Создайте обработку для первого запуска или добавьте процедуру в свой серверный общий модуль. Для толстого клиента код можно разместить в модуле обработки. Вызовите ОтправитьЗаписьНаРасшифровку() из обработчика кнопки или своей серверной процедуры.

В начале примера замените три значения:

ПеременнаяЧто указать
APIХостХост из документации API в кабинете.
APIКлючКлюч созданной интеграции.
ПутьКФайлуПуть к WAV-файлу, доступному процессу 1С.

Если код выполняется на сервере 1С, файл должен быть доступен серверу. Файл на диске компьютера пользователя не становится доступным серверному процессу автоматически.

Скачать код отправки файла (.bsl)

Процедура ОтправитьЗаписьНаРасшифровку() Экспорт
    // Запускайте в серверном модуле или в толстом клиенте 1С.
    // Хост (без https://) возьмите из документации API в кабинете.
    APIХост = "ХОСТ_ИЗ_ДОКУМЕНТАЦИИ";
    APIКлюч = "ВАШ_API_КЛЮЧ";
    ПутьКФайлу = "C:\Records\meeting.wav";

    // Сохраните этот ID вместе с записью для повторов того же запроса.
    external_id = Строка(Новый УникальныйИдентификатор());
    Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    CRLF = Символы.ВК + Символы.ПС;

    Поток = Новый ПотокВПамяти;
    ЗаписьДанных = Новый ЗаписьДанных(
        Поток, КодировкаТекста.UTF8, ,
        Символы.ПС, CRLF, Ложь);

    // Часть 1: файл. Для MP3 поменяйте имя и MIME-тип.
    ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
    ЗаписьДанных.ЗаписатьСтроку(
        "Content-Disposition: form-data; name=""file""; filename=""meeting.wav""");
    ЗаписьДанных.ЗаписатьСтроку("Content-Type: audio/wav");
    ЗаписьДанных.ЗаписатьСтроку("");
    ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
    ЗаписьДанных.Записать(ДвоичныеДанныеФайла);
    ЗаписьДанных.ЗаписатьСтроку("");

    // Часть 2: язык.
    ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
    ЗаписьДанных.ЗаписатьСтроку(
        "Content-Disposition: form-data; name=""language""");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку("auto");

    // Часть 3: связь с записью в вашей системе.
    ЗаписьДанных.ЗаписатьСтроку("--" + Boundary);
    ЗаписьДанных.ЗаписатьСтроку(
        "Content-Disposition: form-data; name=""metadata""");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку(
        "{""external_id"":""" + external_id + """}");

    ЗаписьДанных.ЗаписатьСтроку("--" + Boundary + "--");
    ЗаписьДанных.Закрыть();
    ТелоЗапроса = Поток.ЗакрытьИПолучитьДвоичныеДанные();

    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
    HTTPСоединение = Новый HTTPСоединение(
        APIХост, 443, , , , 60, ЗащищенноеСоединение);
    HTTPЗапрос = Новый HTTPЗапрос("/v1/transcriptions");
    HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса);
    HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + APIКлюч);
    HTTPЗапрос.Заголовки.Вставить("Idempotency-Key", external_id);
    HTTPЗапрос.Заголовки.Вставить(
        "Content-Type", "multipart/form-data; boundary=" + Boundary);

    Попытка
        HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
        Сообщить("HTTP " + Строка(HTTPОтвет.КодСостояния));
        Сообщить(HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"));
    Исключение
        Сообщить("Ошибка отправки: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Процедура отправляет POST /v1/transcriptions. Сам файл идёт в поле file, language=auto включает автоматическое определение языка, а metadata.external_id связывает расшифровку с записью вашей системы.

Если передаёте MP3, замените в заголовках части имя meeting.wav на meeting.mp3, а audio/wav на audio/mpeg. Двоичные данные файла передаются напрямую.

Шаг 3. Сохраните номер задачи

После запуска процедура выведет HTTP-код и JSON-ответ. HTTP 202 означает, что запись принята в обработку. Например:

{
  "id": "123",
  "status": "queued",
  "duration_seconds": 60,
  "request_id": "req_..."
}

Сохраните поле id рядом с документом или звонком в 1С. По этому номеру вы будете проверять готовность и получать результат.

Для автоматического сохранения добавьте следующий блок внутрь процедуры отправки после получения HTTPОтвет:

Если HTTPОтвет.КодСостояния = 202 Тогда
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"));
    ДанныеОтвета = ПрочитатьJSON(Чтение, Истина);
    Чтение.Закрыть();
    ИДЗадачи = Строка(ДанныеОтвета.Получить("id"));
    // Сохраните ИДЗадачи в своей записи интеграции.
КонецЕсли;

Создание задачи и получение текста — два отдельных действия. Ответ 202 приходит сразу, без ожидания окончания расшифровки.

Шаг 4. Проверяйте готовность

Состояние задачи возвращает GET /v1/transcriptions/<id>. В отличие от ответа на создание задачи, данные этого ответа находятся внутри объекта data.

Добавьте вспомогательную функцию в тот же модуль. Она выполняет GET-запрос и возвращает data как соответствие 1С:

Скачать функцию получения данных (.bsl)

Функция ПолучитьДанныеТранскрипты(APIХост, APIКлюч, ПутьЗапроса) Экспорт
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
    HTTPСоединение = Новый HTTPСоединение(
        APIХост, 443, , , , 60, ЗащищенноеСоединение);
    HTTPЗапрос = Новый HTTPЗапрос(ПутьЗапроса);
    HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + APIКлюч);
    HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);

    Если HTTPОтвет.КодСостояния <> 200 Тогда
        ВызватьИсключение "API: HTTP " + Строка(HTTPОтвет.КодСостояния);
    КонецЕсли;

    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"));
    ДанныеОтвета = ПрочитатьJSON(Чтение, Истина);
    Чтение.Закрыть();
    Возврат ДанныеОтвета.Получить("data");
КонецФункции

Теперь запросите состояние, подставив сохранённый номер задачи и те же хост и ключ:

ДанныеЗадачи = ПолучитьДанныеТранскрипты(
    APIХост, APIКлюч, "/v1/transcriptions/" + ИДЗадачи);
Статус = ДанныеЗадачи.Получить("status");
Сообщить("Статус: " + Статус);

Пока задача находится в очереди или обрабатывается, проверяйте её с интервалом, например раз в 15–30 секунд. Когда статус станет done, можно забирать результат. Проверку удобно выполнять регламентным заданием: пользователь продолжает работать в 1С, пока запись расшифровывается.

Шаг 5. Получите текст и сохраните его в 1С

Для готовой задачи вызовите GET /v1/transcriptions/<id>/result. Текст находится в data.text; та же вспомогательная функция уже возвращает содержимое data:

Если Статус = "done" Тогда
    Результат = ПолучитьДанныеТранскрипты(
        APIХост, APIКлюч,
        "/v1/transcriptions/" + ИДЗадачи + "/result");
    ТекстРасшифровки = Результат.Получить("text");
    Сообщить(ТекстРасшифровки);
    // Запишите текст в реквизит или связанный документ вашей конфигурации.
КонецЕсли;

Результат также содержит segments: фрагменты текста со спикерами и временными отметками. Если нужна просто расшифровка для карточки звонка, используйте text. Если делаете просмотр с привязкой к аудио, сохраните и сегменты.

В рабочей интеграции записывайте полученный текст только после успешного ответа API. Место хранения и правила доступа к расшифровке определяются вашей конфигурацией 1С.

Шаг 6. Автоматизируйте обработку записей

Для каждой отправленной записи храните номер задачи, текущий статус и связь с исходным документом. Регламентное задание проверяет незавершённые задачи, получает готовый текст и обновляет соответствующую запись.

Для повторов одной отправки используйте один Idempotency-Key. В примере UUID создаётся при каждом ручном запуске. В рабочем решении создайте и сохраните его до первой отправки, а при сетевом повторе переиспользуйте. Для другой записи создаётся новый ключ.

Когда записей станет много, вместо опроса можно принимать уведомления о готовности через вебхуки. Права ключа, жизненный цикл задач, загрузка больших файлов и вебхуки описаны в руководстве по API Транскрипты.