Как правильно настроить HTTP-запросы к API Астрал.ОФД из 1С и избежать ошибки 404

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

При интеграции систем учета 1С с операторами фискальных данных (ОФД) часто возникает необходимость напрямую получать информацию о пробитых чеках, закрытых сменах, зарегистрированных кассах и работающих кассирах. Оператор Астрал.ОФД предоставляет для этих целей собственное API. Однако при попытке настроить прямое взаимодействие разработчики часто сталкиваются с техническими сложностями: путаницей в методах запроса (GET и POST), неверной передачей параметров авторизации или неправильным выбором рабочего хоста.

В данной статье мы подробно разберем, как правильно реализовать HTTP-запросы к серверу Астрал.ОФД, проанализируем частые ошибки интеграции и приведем готовые примеры кода на языке 1С для работы с фискальными данными.

Выясняем причины ошибок: почему сервер возвращает 404 (Страница не найдена)

Рассмотрим стандартную ситуацию, с которой сталкиваются программисты 1С при первой попытке работы с API Астрал.ОФД. При отправке POST-запроса на адрес тестового контура https://demo.ofd.astralnalog.ru/api/v4.2/statistic.cashiersList сервер возвращает HTML-страницу с ошибкой "404 Страница не найдена", при этом сам HTTP-код ответа сервера равен 200 (ОК).

Проанализируем причины такого поведения системы:

  1. Неверный метод запроса. Техническая документация Астрал.ОФД может указывать на поддержку методов GET и POST. Однако на практике большинство аналитических и статистических методов (таких как получение списка кассиров, касс и смен) требуют отправки исключительно GET-запросов, где все авторизационные параметры передаются прямо в строке URL. Попытка отправить POST-запрос на эти адреса приводит к тому, что веб-сервер ОФД не может сопоставить маршрут (routing) и отдает стандартную заглушку 404.
  2. Путаница с тестовым (demo) и продуктивным серверами. Демонстрационный контур предназначен для тестирования интеграции на вымышленных данных. Если вы используете реальные ключи авторизации (токены) и идентификаторы организации, созданные в вашем личном кабинете, тестовый сервер их не примет. Для получения реальных данных необходимо использовать боевой адрес сервера без приставки demo.
  3. Неверная передача заголовков авторизации. Техническая поддержка оператора иногда рекомендует передавать ключи авторизации в заголовках HTTP-запроса (например, APIKEY). Для большинства стандартных запросов Астрал.ОФД этот способ оказывается нерабочим. Обязательные параметры api_key и id организации должны передаваться в качестве GET-параметров в строке запроса (Query Parameters).

Разберем по шагам: правильный формат HTTP-запроса

Выяснив причины ошибок, сформулируем правила построения успешного запроса к API Астрал.ОФД:

  1. Выбор правильного адреса хоста:
    • Продуктивный контур (рабочая база): ofd.astralnalog.ru
    • Тестовый контур (песочница): demo.ofd.astralnalog.ru
  2. Выбор протокола: Все запросы должны отправляться строго по защищенному протоколу HTTPS (порт 443).
  3. Формирование строки параметров: К основному пути метода (например, /api/v4.2/statistic.cashiersList) необходимо добавить параметры авторизации через знак вопроса. Шаблон строки запроса выглядит следующим образом: /api/v4.2/ИмяМетода?api_key=ВАШ_КЛЮЧ&id=ID_ОРГАНИЗАЦИИ.

Реализация HTTP-запроса в 1С: готовый шаблон кода

Рассмотрим подробнее, как написать отказоустойчивый код в 1С для отправки GET-запроса и последующего разбора полученного JSON-ответа. Для этого мы будем использовать стандартные объекты платформы HTTPСоединение, HTTPЗапрос и ЧтениеJSON.

Ниже представлен пример процедуры, которая подключается к API Астрал.ОФД и считывает список кассиров:


&НаСервере
Процедура ПолучитьСписокКассировИзОФД()
    
    // 1. Задаем базовые параметры подключения
    СерверИсточник = "ofd.astralnalog.ru"; // Для рабочей базы используем адрес без "demo"
    ИмяМетодаAPI  = "/api/v4.2/statistic.cashiersList";
    
    // Получаем авторизационные данные из констант или настроек системы
    APIКлюч       = "abcdef1234567890abcdef1234567890"; // Ваш уникальный токен из ЛК Астрал.ОФД
    IDОрганизации = "12345";                             // Идентификатор вашей организации в ОФД
    
    // 2. Формируем строку запроса с GET-параметрами
    СтрокаЗапроса = ИмяМетодаAPI + "?api_key=" + APIКлюч + "&id=" + IDОрганизации;
    
    // 3. Инициализируем защищенное SSL-соединение
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
    
    Попытка
        Соединение = Новый HTTPСоединение(СерверИсточник, 443, , , , 30, ЗащищенноеСоединение);
    Исключение
        ЗаписьЖурналаРегистрации("ИнтеграцияОФД.ОшибкаПодключения",
            УровеньЖурналаРегистрации.Ошибка, , , 
            "Не удалось установить SSL-соединение с сервером: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // 4. Создаем и отправляем HTTP-запрос
    Запрос = Новый HTTPЗапрос(СтрокаЗапроса);
    // Рекомендуется явно указать кодировку и тип контента
    Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
    Исключение
        ЗаписьЖурналаРегистрации("ИнтеграцияОФД.ОшибкаЗапроса",
            УровеньЖурналаРегистрации.Ошибка, , , 
            "Ошибка при отправке запроса к ОФД: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // 5. Обрабатываем полученный ответ
    Если Ответ.КодСостояния = 200 Тогда
        
        // Анализируем содержимое ответа
        ТелоОтвета = Ответ.ПолучитьТелоКакСтроку("UTF-8");
        
        // Проверим, не вернул ли сервер HTML-страницу вместо JSON (признак неверного пути/метода)
        Если Найти(ТелоОтвета, "<!DOCTYPE html>") > 0 Тогда
            ВызватьИсключение "Сервер ОФД вернул ошибку веб-страницы (404/500) вместо ожидаемого JSON-пакета.";
        КонецЕсли;
        
        // Парсим JSON структуру
        Чтение = Новый ЧтениеJSON;
        Чтение.УстановитьСтроку(ТелоОтвета);
        ДанныеОтвета = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();
        
        // Обрабатываем результат парсинга
        Если ДанныеОтвета.Свойство("ok") И ДанныеОтвета.ok = Ложь Тогда
            // Сервер вернул логическую ошибку API
            ОписаниеОшибкиОФД = "Неизвестная ошибка API";
            Если ДанныеОтвета.Свойство("description") Тогда
                ОписаниеОшибкиОФД = ДанныеОтвета.description;
            КонецЕсли;
            ВызватьИсключение "Ошибка API Астрал.ОФД: " + ОписаниеОшибкиОФД;
        КонецЕсли;
        
        // Если все успешно, перебираем полученную коллекцию данных
        // Например, для statistic.cashiersList структура ответа содержит массив кассиров
        Если ДанныеОтвета.Свойство("cashiers") Тогда
            Для Каждого Кассир Из ДанныеОтвета.cashiers Цикл
                Сообщить("Найден кассир: " + Кассир.name + " (ИНН: " + Кассир.inn + ")");
            КонецЦикла;
        КонецЕсли;
        
    Иначе
        // Сервер вернул системную ошибку (например, 500, 403, 401)
        ЗаписьЖурналаРегистрации("ИнтеграцияОФД.ОшибкаСервера",
            УровеньЖурналаРегистрации.Предупреждение, , , 
            СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                "Сервер ОФД вернул код ошибки: %1. Текст ответа: %2", 
                Ответ.КодСостояния, 
                Ответ.ПолучитьТелоКакСтроку()
            )
        );
    КонецЕсли;
    
КонецПроцедуры

Альтернативное стандартное решение: сервис «1С-Чеки ОФД»

Написание собственных обработчиков интеграции и разбор JSON-ответов вручную требуют постоянной поддержки кода разработчиком. При изменении формата обмена со стороны оператора фискальных данных вам придется оперативно переписывать модули 1С. Чтобы избежать этих трудозатрат, фирма 1С предлагает готовое типовое решение — встроенный сервис «1С-Чеки ОФД».

Рассмотрим его ключевые возможности и преимущества:

Интеграция через универсальные API-агрегаторы (Мой.ОФД)

Если в вашей организации используется кассовое оборудование, подключенное к разным операторам фискальных данных (например, часть касс работает через Астрал.ОФД, часть — через Платформа ОФД или Такском), разработка индивидуальных HTTP-запросов под каждого оператора становится крайне сложной задачей. В таких случаях целесообразно использовать универсальные API-агрегаторы, такие как сервис «Мой.ОФД».

Использование агрегаторов позволяет унифицировать код интеграции в 1С:

  1. Все запросы отправляются на единый адрес агрегатора, независимо от того, какой ОФД обслуживает конкретную кассу.
  2. Для разделения потоков данных в HTTP-заголовках запроса передаются специальные параметры. Например, для получения данных из Астрал.ОФД заголовки будут выглядеть так:
    • Authorization: {Ваш единый токен доступа к агрегатору}
    • X-Source: astral-ofd
  3. Агрегатор самостоятельно обращается к серверам Астрал.ОФД, забирает данные и возвращает их в вашу базу 1С в стандартизированном JSON-формате, одинаковом для всех операторов фискальных данных. Это значительно упрощает поддержку кода в конфигурации 1С.

Выбор оптимального метода интеграции зависит от ваших бизнес-задач. Для простых типовых сценариев бухгалтерского учета идеальным выбором будет стандартный сервис «1С-Чеки ОФД». Если же вам требуется гибкая нестандартная аналитика в реальном времени, вы можете использовать приведенный в статье пример кода для прямой работы с API Астрал.ОФД.

← На главную