Интеграция 1С с внешними языками программирования, такими как Python, открывает широкие возможности для аналитики данных, построения сложных отчетов и использования библиотек машинного обучения. Разберем подробно, как организовать стабильный канал передачи данных между этими системами, используя современные механизмы API.
Проанализируем самый быстрый способ получения данных, который не требует глубокого программирования внутри 1С. Механизм OData (Open Data Protocol) позволяет обращаться к объектам метаданных 1С через HTTP-запросы, что зачастую надежнее, чем выполнение алгоритмов через COM-подключение.
Для начала настроим публикацию базы. Рассмотрим этот процесс по шагам:
После этого мы сможем обращаться к справочникам и документам по 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, чтобы ограничить выборку периодом или конкретной организацией. Это значительно снизит нагрузку на сеть.
Если нам требуется сложная бизнес-логика или агрегированные данные (например, готовые суммы продаж из разных регистров), стандартного 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.
Когда мы получили данные через 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С. Для отчета по продажам новички часто пытаются выгружать документы РеализацияТоваровУслуг. Однако это неэффективно, так как придется вручную обрабатывать возвраты, корректировки и вычислять себестоимость.
Правильным подходом будет обращение к Регистрам Накопления. Посмотрим на наиболее полезные регистры:
ВыручкаИСебестоимостьПродаж — содержит уже готовые данные о суммах продаж, себестоимости и валовой прибыли.Продажи (в старых редакциях) — основной источник данных о реализованных товарах.ОстаткиТоваров — если отчет по продажам нужно дополнить данными о текущих складских запасах.При использовании OData доступ к ним осуществляется через сущности вида AccumulationRegister_НазваниеРегистра_Selection. Работа с виртуальными таблицами оборотов через кастомные HTTP-сервисы будет самым производительным решением для аналитики на Python.