Как настроить подключение к 1С по API из Python для выгрузки данных по продажам?

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

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

Вариант 1: Использование стандартного интерфейса OData

Проанализируем самый быстрый способ получения данных, который не требует глубокого программирования внутри 1С. Механизм OData (Open Data Protocol) позволяет обращаться к объектам метаданных 1С через HTTP-запросы, что зачастую надежнее, чем выполнение алгоритмов через COM-подключение.

Для начала настроим публикацию базы. Рассмотрим этот процесс по шагам:

  1. Откроем конфигуратор 1С под правами администратора.
  2. Перейдем в меню «Администрирование» — «Публикация на веб-сервере».
  3. В открывшемся окне выберем установленный веб-сервер (Apache или IIS).
  4. На вкладке «HTTP сервисы» установим флажок «Публиковать стандартный интерфейс OData».
  5. Нажмем «Опубликовать».

После этого мы сможем обращаться к справочникам и документам по URL-адресу. Для отладки таких запросов удобно использовать Post1С — аналог Postman на платформе 1С. Например, чтобы получить список документов реализации, используем конструкцию:

http://server/base/odata/standard.odata/Document_РеализацияТоваровУслуг

Выясним, как работать с этими данными на стороне Python (для освоения теории запросов рекомендуем интерактивный обучающий курс HTTP-QUEST). Для этого нам понадобится библиотека requests. Посмотрим на пример кода для получения данных:


import requests
from requests.auth import HTTPBasicAuth

url = "http://server/base/odata/standard.odata/Document_РеализацияТоваровУслуг"
auth = HTTPBasicAuth('username', 'password')
headers = {"Accept": "application/json"}

response = requests.get(url, auth=auth, headers=headers)

if response.status_code == 200:
    data = response.json()
    print("Данные успешно получены")
else:
    print(f"Ошибка: {response.status_code}")

Важно помнить, что OData по умолчанию возвращает все записи. Для отчетов по продажам обязательно используем параметры фильтрации $filter, чтобы ограничить выборку периодом или конкретной организацией. Это значительно снизит нагрузку на сеть.

Вариант 2: Создание собственных HTTP-сервисов

Если нам требуется сложная бизнес-логика или агрегированные данные (например, готовые суммы продаж из разных регистров), стандартного OData может быть недостаточно. В этом случае создадим собственный HTTP-сервис в конфигурации 1С.

Разберем этот процесс подробнее. В дереве метаданных найдем ветку «Общие» — «HTTP-сервисы» и добавим новый объект. Также можно задействовать общий модуль для быстрой организации HTTP сервиса с готовым набором функций.

Проанализируем пример кода на стороне 1С для формирования отчета по продажам:


Функция ПродажиGet(Запрос)
    
    ЗапросКБД = Новый Запрос;
    ЗапросКБД.Текст = 
        "ВЫБРАТЬ
        |   ПродажиОбороты.Номенклатура.Наименование КАК Товар,
        |   ПродажиОбороты.КоличествоОборот КАК Количество,
        |   ПродажиОбороты.СуммаВыручкиОборот КАК Сумма
        |ИЗ
        |   РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК ПродажиОбороты";
    
    // Установка параметров из параметров запроса URL
    НачалоПериода = Запрос.ПараметрыURL.Получить("start");
    ЗапросКБД.УстановитьПараметр("НачалоПериода", НачалоПериода);
    ЗапросКБД.УстановитьПараметр("КонецПериода", ТекущаяДата());
    
    Результат = ЗапросКБД.Выполнить().Выгрузить();
    
    // Преобразование в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Результат);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Ответ.Заголовки.Вставить("Content-Type", "application/json");
    
    Возврат Ответ;
    
КонецФункции

Этот подход позволяет нам выполнять всю тяжелую работу по расчету итогов на сервере 1С, передавая в Python уже готовую компактную таблицу. Мы используем объект ЗаписьJSON для автоматической конвертации таблицы значений в формат, понятный Python.

Обработка данных в Python с помощью Pandas

Когда мы получили данные через API (неважно, через OData или HTTP-сервис), их необходимо преобразовать в удобный для анализа формат. Лучшим инструментом для этого в Python является библиотека pandas.

Рассмотрим, как быстро превратить JSON-ответ от 1С в аналитическую таблицу (DataFrame):


import pandas as pd
import requests

# Предположим, мы получили ответ от нашего HTTP-сервиса
response = requests.get(api_url, auth=('admin', 'pass'))
json_data = response.json()

# Создаем DataFrame
df = pd.DataFrame(json_data)

# Теперь мы можем легко анализировать продажи
total_sales = df['Сумма'].sum()
top_products = df.groupby('Товар')['Количество'].sum().sort_values(ascending=False)

print(f"Общая выручка: {total_sales}")
print("Топ товаров:")
print(top_products.head())

Использование DataFrame позволяет выполнять фильтрацию, группировку и построение графиков буквально в несколько строк кода. Если данных очень много, обратим внимание на библиотеку Grequests, которая позволяет выполнять HTTP-запросы асинхронно, ускоряя процесс выгрузки данных в разы.

Безопасность и авторизация

При настройке интеграции нельзя забывать о защите данных. Выясним основные правила безопасного подключения:

Выбор правильного источника данных в 1С

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

Правильным подходом будет обращение к Регистрам Накопления. Посмотрим на наиболее полезные регистры:

  1. ВыручкаИСебестоимостьПродаж — содержит уже готовые данные о суммах продаж, себестоимости и валовой прибыли.
  2. Продажи (в старых редакциях) — основной источник данных о реализованных товарах.
  3. ОстаткиТоваров — если отчет по продажам нужно дополнить данными о текущих складских запасах.

При использовании OData доступ к ним осуществляется через сущности вида AccumulationRegister_НазваниеРегистра_Selection. Работа с виртуальными таблицами оборотов через кастомные HTTP-сервисы будет самым производительным решением для аналитики на Python.

← На главную