Периодически разработчики внешних систем (BI-платформ, OLAP-кубов или интернет-магазинов) настаивают на получении данных из 1С напрямую через запросы к MS SQL Server. На первый взгляд это кажется быстрым и эффективным решением, однако такой подход таит в себе множество скрытых угроз: от технических сбоев до юридических рисков. В рамках данной статьи мы подробно разберем, почему «прямые запросы» — это крайняя мера, проанализируем основные риски и рассмотрим правильные архитектурные способы решения этой задачи.
Первое, о чем стоит помнить — это юридическая плоскость. В типовом лицензионном соглашении 1С четко указано, что доступ к данным должен осуществляться только через механизмы платформы. Прямое чтение или, тем более, запись в таблицы СУБД в обход сервера 1С:Предприятия является нарушением условий использования продукта. В корпоративном секторе это может стать серьезным препятствием при прохождении аудита ПО. Если заказчик настаивает на прямом доступе, мы рекомендуем фиксировать этот риск документально, чтобы снять ответственность с разработчика 1С.
Рассмотрим техническую сторону. Платформа 1С является «надстройкой» над СУБД, и она сама решает, как называть таблицы. Проанализируем основные ситуации, когда ваши SQL-запросы гарантированно «сломаются»:
_Reference172 может исчезнуть, а данные переедут в новую с другим индексом..dt и загрузите ее обратно (даже на тот же сервер), 1С переназначит внутренние идентификаторы таблиц. Все ваши SELECT к конкретным именам перестанут работать.Когда внешняя система подключается к SQL под пользователем sa или специально созданным пользователем БД, она видит всё. Разберем, какие механизмы 1С при этом игнорируются:
binary(16), а составные типы (когда поле может быть и справочником, и документом) раскладываются на несколько колонок (тип и значение). Написание запросов к таким полям превращается в «мозгодробильную» задачу.Если прямой доступ неизбежен (например, для высоконагруженных систем аналитики), мы должны создать «прослойку», которая скроет внутреннюю кухню 1С. Рассмотрим, как автоматизировать создание человекочитаемых представлений.
Для начала нам необходимо получить соответствие имен метаданных и имен таблиц в SQL. Воспользуемся встроенной функцией ПолучитьСтруктуруХраненияБД(). Разберем пример кода, который выводит структуру справочника:
Структура = ПолучитьСтруктуруХраненияБД("Справочник.Номенклатура", Истина);
Для Каждого Таблица Из Структура Цикл
Сообщить("Имя таблицы в SQL: " + Таблица.ИмяТаблицыХранения);
Для Каждого Поле Из Таблица.Поля Цикл
Сообщить(" Реквизит: " + Поле.ИмяМетаданных + " -> Поле SQL: " + Поле.ИмяПоляХранения);
КонецЦикла;
КонецЦикла;
На основе этих данных можно программно генерировать SQL-скрипты для создания VIEW. Рассмотрим пример того, как может выглядеть генерация текста представления через ADO:
ТекстЗапросаSQL = "
|CREATE VIEW [Справочник_Номенклатура] AS
|SELECT
| _IDRRef AS [Ссылка],
| _Description AS [Наименование],
| _Code AS [Код]
|FROM _Reference172";
// Далее выполнение команды через Connection.Execute()
Важный совет: Чтобы вьюхи всегда были актуальны, рекомендуется запускать регламентное задание, которое будет пересоздавать их каждую ночь или сразу после обновления конфигурации. Можно отслеживать изменение версии конфигурации через таблицу [Config].
Вместо того чтобы давать доступ к SQL, проанализируем более надежные способы передачи данных:
Прямые запросы могут быть оправданы только в одном случае: огромные объемы данных (миллионы строк), которые сервер 1С не может быстро переварить и отдать через XML/JSON. В этой ситуации мы рекомендуем использовать отчетный сервер (Report Server). Данные из основной базы реплицируются на отдельный сервер SQL, и уже там аналитики могут строить свои запросы, не создавая нагрузку на рабочую базу и не рискуя целостностью данных.
Посмотрим на ситуацию здраво: прямой доступ к SQL — это костыль, который экономит время интегратора в первый день, но создает проблемы администратору 1С на годы вперед. Мы рекомендуем настаивать на HTTP-сервисах как на самом стабильном решении. Если же вы выбираете путь SQL, обязательно используйте автоматизированные VIEW и никогда не пишите запросы напрямую к таблицам типа _Reference172.