Метод GET /api/v1/connector/{id_connector}/configuration-metadata/{configuration_metadata_type}
Краткое описание
Получает метаданные конфигурации 1С для объектов из базы данных. Эндпоинт:
Возвращает данные потоком (StreamingResponse) — не загружает весь объект в память
Автоматически распаковывает CSV формат из БД в JSON
Поддерживает получение больших объёмов данных без ограничений по памяти
Входные параметры
Параметры пути (обязательные):
id_connector(строка, обязательный)Уникальный идентификатор коннектора 1С
Пример:
8f4e5a2c-1234-5678-90ab-cdef12345678Должна существовать запись с этим
id_connectorв БД
configuration_metadata_type(enum, обязательный)Тип метаданных конфигурации
Допустимые значения определены в
enum ConfigurationMetadataTypeПримеры:
common,constants,catalogs,documents,document-journals,enumerations,reports,data-processors,charts-of-characteristic-types,charts-of-accounts,charts-of-calculation-types,information-registers,accumulation-registers,accounting-registers,calculation-registers,business-processes,tasks,external-data-sources,other.При передаче неверного значения возвращается 400 с сообщением об ошибке
Алгоритм работы метода
ЭТАП 1: Валидация типа метаданных
Проверяется, что
configuration_metadata_typeявляется допустимым значением enumЕсли нет — возвращается
HTTPException(400)Преобразуется enum значение в соответствующее имя типа в БД
ЭТАП 2: Поиск ID записи
Подключается к PostgreSQL через асинхронный коннектор psycopg
Выполняется SELECT для поиска записи:
WHERE id_connector = {переданный_id} AND type = {переданный_тип}Если запись не найдена — возвращается
HTTPException(404, "Not found")Если найдена — извлекается
id_configuration_metadata_entity
ЭТАП 3: Подготовка потокового ответа
Создаётся асинхронный генератор
body_gen()для потоковой передачи данныхГенератор использует COPY FROM STDOUT команду PostgreSQL:
Формирует JSON объект из записи
Передаёт его через COPY в CSV формате
Потоком читает и преобразует данные
ЭТАП 4: Обработка потока данных
Внутри генератора:
a) Чтение чанков из БД:
Цикл читает части (chunks) данных из COPY потока
Каждый chunk — это часть CSV строки
b) Обработка первого чанка:
Удаляется открывающая кавычка CSV (if buf[0:1] == b'"')
Это нужно потому что CSV оборачивает весь JSON в кавычки
c) Замена экранированных кавычек:
В CSV кавычки экранируются как "" (две кавычки)
Заменяются на одну кавычку: buf.replace(b'""', b'"')
Это восстанавливает исходный JSON формат
d) Обработка хвоста (tail):
Последние 2 байта каждого чанка сохраняются в
tail_bufЭто нужно для корректной обработки границ чанков
Например, кавычка может быть разделена между чанками
e) Выход данных:
Все чанки кроме последних 2 байт отправляются клиенту
Предыдущие хвосты добавляются в начало
ЭТАП 5: Финализация потока
После прочтения всех чанков обрабатывается финальный хвост:
Удаляются символы конца строки (\r\n или \n)
Удаляется закрывающая кавычка CSV
Оставшиеся данные отправляются клиенту
Итоговый результат:
Клиент получает JSON объект в формате:
{ "id_configuration_metadata_entity": "uuid-string", "id_connector": "connector-id", "type": "document", "data": { ... содержимое метаданных ... } }