Перед системными администраторами и разработчиками часто встает задача интеграции 1С с внешними системами, работающими на операционных системах семейства Linux. В среде Windows классическим решением был технологический инструмент COMConnector, однако на платформе Linux этот механизм недоступен. Рассмотрим подробно, как организовать безопасное и эффективное чтение данных из информационной базы 1С 8.3 с помощью сторонних скриптов на Python.
Самым надежным и архитектурно правильным способом интеграции является создание собственных API-эндпоинтов на стороне 1С. Это позволяет полностью изолировать внешнее приложение от внутренней структуры таблиц базы данных и отсекать невалидные запросы на уровне платформы.
Разберем основные преимущества данного подхода:
Для реализации этого метода необходимо опубликовать базу данных 1С на веб-сервере (IIS или Apache) и написать модуль HTTP-сервиса в Конфигураторе.
Если нет возможности писать собственный код обработки HTTP-запросов на языке 1С, вы можете воспользоваться встроенным в платформу 1С 8.3 интерфейсом OData. Данный механизм позволяет автоматически предоставить REST API к объектам метаданных без написания кода.
Рассмотрим по шагам, как задействовать OData для решения задачи:
Для извлечения графических файлов (фотографий товаров), хранящихся в реквизитах типа «Хранилище значения», OData предлагает удобный механизм: к URL запроса добавляется суффикс /$value. В ответ веб-сервер возвращает бинарный поток файла, который Python сразу может сохранить на диск или передать далее по цепочке.
В случаях, когда требуется максимальная скорость чтения или нет возможности опубликовать веб-сервер, допустимо прямое подключение к базе данных MS SQL Server из Linux-машины. Платформа 1С разрешает выполнение операторов SELECT сторонними утилитами, однако здесь необходимо учитывать ряд технических особенностей.
Для подключения из Python на Linux используются специализированные драйверы:
msodbcsql17 или msodbcsql18.pyodbc или pymssql для выполнения SQL-запросов.Так как 1С формирует имена физических таблиц (например, _Reference123) и полей (например, _Fld4567) динамически, вам потребуется узнать их соответствие. Выяснить структуру хранения можно прямо из Конфигуратора или с помощью встроенного метода платформы:
СтруктураБазы = ПолучитьСтруктуруХраненияБазыДанных();
Анализируя полученную таблицу, вы узнаете точные имена SQL-таблиц для ваших справочников и регистров.
Важные нюансы прямого чтения MS SQL:
1. Извлечение картинок: изображения хранятся в полях типа VARBINARY(MAX) или IMAGE. Платформа 1С сжимает файлы алгоритмом Deflate/Zlib и добавляет служебный бинарный заголовок. Чтобы получить исходную картинку в Python, необходимо сдвинуть указатель за пределы платформенного заголовка и распаковать массив байтов с помощью встроенного модуля zlib.
2. Преобразование GUID: ссылки 1С хранятся в базе данных в виде BINARY(16). Порядок байтов в них отличается от стандартного представления UUID в Windows/Linux, поэтому при выборке идентификаторов их необходимо конвертировать специальной функцией перестановки байтов.
3. Использование SQL-представлений (Views): чтобы упростить выборку из Python и изолировать скрипт от изменений названий полей, рекомендуется создать на стороне MS SQL отдельное представление (SQL View) или регламентным заданием в 1С заполнять простой промежуточный регистр с примитивными типами данных (строки, числа, даты).
Если прямое чтение из боевой базы нежелательно по соображениям нагрузки или безопасности, проанализируем архитектурные схемы с промежуточным звеном:
Подводя итог, для разовых выборок или небольших проектов отличным выбором станет использование протокола OData или HTTP-сервисов. Если же требуется высокая производительность при передаче больших объемов данных, рекомендуем использовать прямое чтение MS SQL через SQL-представление или выгрузку в промежуточный кэш.