При интеграции систем учета 1С с операторами фискальных данных (ОФД) часто возникает необходимость напрямую получать информацию о пробитых чеках, закрытых сменах, зарегистрированных кассах и работающих кассирах. Оператор Астрал.ОФД предоставляет для этих целей собственное API. Однако при попытке настроить прямое взаимодействие разработчики часто сталкиваются с техническими сложностями: путаницей в методах запроса (GET и POST), неверной передачей параметров авторизации или неправильным выбором рабочего хоста.
В данной статье мы подробно разберем, как правильно реализовать HTTP-запросы к серверу Астрал.ОФД, проанализируем частые ошибки интеграции и приведем готовые примеры кода на языке 1С для работы с фискальными данными.
Рассмотрим стандартную ситуацию, с которой сталкиваются программисты 1С при первой попытке работы с API Астрал.ОФД. При отправке POST-запроса на адрес тестового контура https://demo.ofd.astralnalog.ru/api/v4.2/statistic.cashiersList сервер возвращает HTML-страницу с ошибкой "404 Страница не найдена", при этом сам HTTP-код ответа сервера равен 200 (ОК).
Проанализируем причины такого поведения системы:
demo.APIKEY). Для большинства стандартных запросов Астрал.ОФД этот способ оказывается нерабочим. Обязательные параметры api_key и id организации должны передаваться в качестве GET-параметров в строке запроса (Query Parameters).Выяснив причины ошибок, сформулируем правила построения успешного запроса к API Астрал.ОФД:
ofd.astralnalog.rudemo.ofd.astralnalog.ru/api/v4.2/statistic.cashiersList) необходимо добавить параметры авторизации через знак вопроса. Шаблон строки запроса выглядит следующим образом: /api/v4.2/ИмяМетода?api_key=ВАШ_КЛЮЧ&id=ID_ОРГАНИЗАЦИИ.Рассмотрим подробнее, как написать отказоустойчивый код в 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",
Ответ.КодСостояния,
Ответ.ПолучитьТелоКакСтроку()
)
);
КонецЕсли;
КонецПроцедуры
Написание собственных обработчиков интеграции и разбор JSON-ответов вручную требуют постоянной поддержки кода разработчиком. При изменении формата обмена со стороны оператора фискальных данных вам придется оперативно переписывать модули 1С. Чтобы избежать этих трудозатрат, фирма 1С предлагает готовое типовое решение — встроенный сервис «1С-Чеки ОФД».
Рассмотрим его ключевые возможности и преимущества:
Отчет о розничных продажах.Если в вашей организации используется кассовое оборудование, подключенное к разным операторам фискальных данных (например, часть касс работает через Астрал.ОФД, часть — через Платформа ОФД или Такском), разработка индивидуальных HTTP-запросов под каждого оператора становится крайне сложной задачей. В таких случаях целесообразно использовать универсальные API-агрегаторы, такие как сервис «Мой.ОФД».
Использование агрегаторов позволяет унифицировать код интеграции в 1С:
Authorization: {Ваш единый токен доступа к агрегатору}X-Source: astral-ofdВыбор оптимального метода интеграции зависит от ваших бизнес-задач. Для простых типовых сценариев бухгалтерского учета идеальным выбором будет стандартный сервис «1С-Чеки ОФД». Если же вам требуется гибкая нестандартная аналитика в реальном времени, вы можете использовать приведенный в статье пример кода для прямой работы с API Астрал.ОФД.