Интеграция 1С с современными аналитическими СУБД, такими как ClickHouse, через механизм Внешних источников данных — это мощный инструмент для построения отчетов. Однако на пути разработчика часто встают неочевидные препятствия: драйвер, установленный в системе, упорно не появляется в списке доступных в Конфигураторе, а после настройки подключения простейшие запросы с соединениями (JOIN) «падают» с загадочными ошибками синтаксиса. В этой статье мы подробно разберем, как преодолеть эти трудности.
Рассмотрим ситуацию: вы скачали и установили актуальную версию ODBC-драйвера для ClickHouse, проверили его наличие в «Администраторе источников данных ODBC» в Windows, но при попытке добавить таблицу во внешний источник данных в 1С видите только «SQL Server». Проанализируем, почему это происходит.
Главная особенность работы платформы 1С в клиент-серверном варианте заключается в том, что список доступных драйверов и источников данных формируется на стороне сервера 1С:Предприятия, а не на локальном компьютере, где запущен Конфигуратор. Это классическая «ловушка», в которую попадают многие разработчики.
Разберем по шагам, что необходимо сделать для корректного отображения драйвера:
ragent (Агент сервера 1С).USR1CV8), она не имеет доступа к вашему личному списку источников данных.Посмотрим на пример логики: если вы открываете файловую базу, драйверы видны, так как в этом режиме 1С работает как локальное приложение. Как только вы переходите в клиент-сервер — источником правды становится сервер (в отличие от выполнения запросов через COM-подключение, где работа идет через внешнее приложение).
Предположим, драйвер стал виден, таблицы подключены, но при выполнении запроса в СКД или через объект Запрос, где используется ЛЕВОЕ СОЕДИНЕНИЕ, вы получаете ошибку:
Code: 62. DB::Exception: Syntax error: failed at position 38 ('{') (line 4, col 7): {oj "db1"."sales" T1
LEFT OUTER JOIN "db1"."sklady" T2
ON (T1."id_sklad" = T2.id)}
Выясним причину. Эта ошибка возникает из-за того, что платформа 1С при генерации запроса к внешнему источнику через ODBC использует стандартные escape-последовательности ODBC для внешних соединений. Они обозначаются конструкцией {oj ...} (Outer Join). К сожалению, ClickHouse по умолчанию не поддерживает такой синтаксис и ожидает стандартный SQL.
Чтобы решить проблему с {oj}, необходимо правильно сконфигурировать сам ODBC-драйвер в Windows. Разберем основные параметры, которые помогут нам «подружить» 1С и ClickHouse:
Driver → Use SQL standard outer join syntax."Table"). ClickHouse же по умолчанию может ожидать обратные кавычки (`Table`) или вовсе обходиться без них. В настройках драйвера проверьте опцию Quotations и установите режим, совместимый с требованиями 1С.Внешнего источника данных, в поле СУБД никогда не выбирайте «MS SQL Server», если подключаетесь к ClickHouse. Правильнее всего будет выбрать значение «Прочее» (Other). Это заставит 1С генерировать более универсальные запросы.Проанализируем ситуацию, когда даже после настройки драйвера сложные запросы СКД продолжают выдавать ошибки. ClickHouse — это колоночная база данных, и ее логика выполнения соединений отличается от классических реляционных баз.
Например, ClickHouse требует четкого понимания типов соединений: ANY LEFT JOIN или ALL LEFT JOIN. Платформа 1С об этом «не знает» и шлет стандартный LEFT JOIN. Если ваша версия ClickHouse или драйвера не справляется с автоматической интерпретацией, стоит рассмотреть следующие обходные пути:
1. Использование прямого SQL-запроса: Вместо того чтобы позволять 1С самой строить запрос из объектов внешнего источника, вы можете написать запрос на языке ClickHouse (Native SQL).
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ * ИЗ ВнешнийИсточникДанных.ClickHouse.Таблица.ИмяТаблицы";
// В некоторых случаях лучше использовать менеджер внешнего источника
// для выполнения прямого кода, если платформа позволяет.
2. Промежуточный Linked Server (Связанный сервер): Это продвинутое решение. На сервере MS SQL Server создается Linked Server до ClickHouse через тот же ODBC драйвер. В 1С внешний источник подключается не напрямую к ClickHouse, а к MS SQL Server. В этом случае MS SQL выступает в роли «умного» транслятора, который берет на себя все сложности с {oj} и кавычками.
При работе с ClickHouse через внешние источники часто возникают конфликты типов, особенно с датами и значениями NULL. ClickHouse активно использует тип Nullable(T). Если 1С встречает такое поле через ODBC, она может некорректно сопоставить его со своими внутренними типами.
Совет: В схеме внешнего источника данных в 1С после загрузки таблиц проверьте типы полей вручную. Для дат лучше явно указывать Дата, а для строк — контролировать длину. Если в ClickHouse используются специфические типы вроде UInt64, убедитесь, что в 1С им назначено число с соответствующей точностью.
Подводя итог, можно сказать, что связка 1С и ClickHouse через внешние источники данных вполне работоспособна, если соблюдать два главных правила: устанавливать 64-битный драйвер на сервер как System DSN и корректировать настройки синтаксиса в конфигурации самого драйвера. Для программной проверки параметров активного подключения подойдёт способ узнать строку соединения внешнего источника данных.