В современной практике системной интеграции часто возникает задача получения данных из Big Data хранилищ, таких как Hadoop, непосредственно в среду 1С:Предприятие. Одним из наиболее распространенных способов является использование интерфейса ADODB и специализированных ODBC драйверов. Однако при реализации такого подключения разработчики часто сталкиваются с трудностями, когда стандартный код отказывается работать в среде 1С, несмотря на успешные тесты в сторонних утилитах.
В данной статье мы подробно разберем процесс подключения к Hadoop через драйвер Treasure Data Presto, проанализируем возможные ошибки и найдем оптимальные пути их решения.
Рассмотрим типовой сценарий: в системе настроен системный DSN (например, с именем KUBA1), использующий 64-битный драйвер. Тесты соединения через администратор источников данных ODBC проходят успешно. Попробуем реализовать подключение на стороне 1С, используя объект ADODB.Connection.
Проанализируем пример кода, который может быть использован в обработке или серверном модуле:
ConnectionString = "DSN=KUBA1;";
База = "reports";
Запрос = "SELECT * from reports.work_sale_mechanic";
Попытка
Connection = Новый COMОбъект("ADODB.Connection");
Исключение
Сообщить("Неудачная попытка создания объекта: ADODB.Connection");
КонецПопытки;
Connection.ConnectionString = ConnectionString;
Попытка
Connection.Open();
Сообщить("Соединение успешно установлено!");
Исключение
Сообщить(Строка(ТекущаяДата()) + " Не удалось подключиться к БД: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Часто на этапе выполнения метода Open() возникает исключительная ситуация: "Error with HTTP API ... Couldn't connect to server". При этом аналогичный код на VBScript, запущенный на том же сервере, может работать абсолютно корректно. Выясним, в чем кроются причины такого поведения.
Практика показывает, что в версиях платформы 8.3.10.х наблюдались определенные сложности при работе с 64-битными COM-объектами и маршалингом данных между подсистемами. Как подтверждает опыт многих разработчиков, переход на более современные версии платформы (начиная с 8.3.12 и выше) зачастую решает проблему "магическим" образом без изменения программного кода.
Важно: Если вы столкнулись с ошибкой 1020 при подключении к Presto, в первую очередь рекомендуется обновить технологическую платформу до актуального релиза. В новых версиях были оптимизированы механизмы выделения памяти под сетевые буферы и улучшена работа с внешними компонентами через OLE DB.
Разберем ситуацию, когда код выполняется на стороне сервера. В отличие от VBScript, который вы запускаете под своей учетной записью, сервер 1С работает от имени технического пользователя (обычно USR1CV8). Это создает ряд нюансов:
cacert.pem). Убедитесь, что у пользователя USR1CV8 есть права на чтение директории, где лежит сертификат, а в настройках драйвера указан полный абсолютный путь.Treasure Data. Если в системе прописаны переменные окружения для прокси, драйвер может пытаться использовать их, что приведет к ошибке Couldn't connect to server, если координатор Presto находится во внутренней сети.При использовании ADODB в 1С для работы через ODBC рекомендуется явно указывать провайдера данных. Хотя система может определить его автоматически, явное указание повышает стабильность инициализации соединения.
Рассмотрим более надежный вариант формирования строки подключения:
// Явное указание провайдера MSDASQL
ConnectionString = "Provider=MSDASQL;DSN=KUBA1;UID=your_user;PWD=your_password;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.CommandTimeout = 0; // Устанавливаем бесконечное ожидание для тяжелых запросов
Connection.Open(ConnectionString);
Обратите внимание на параметр CommandTimeout. Запросы к Hadoop/Presto могут обрабатываться длительное время (от нескольких минут до часов), так как это аналитическая база данных. Стандартный таймаут в 30 секунд почти гарантированно приведет к разрыву соединения при выполнении реальных задач.
Поскольку Presto по своей сути работает поверх HTTP (REST API), использование связки 1С -> ADODB -> ODBC Driver -> HTTP API является избыточным. Каждый слой вносит свои задержки и потенциальные точки отказа. Рассмотрим современный способ интеграции через встроенный объект 1С HTTPСоединение.
Преимущества данного метода:
ODBC на каждом сервере.JSON, который Presto возвращает нативно.Пример логики взаимодействия через REST API:
Сервер = "MyHost.ru";
Порт = 18080;
Заголовок = Новый Соответствие();
Заголовок.Вставить("X-Presto-User", "1C_User"); // Обязательный заголовок для Presto
Соединение = Новый HTTPСоединение(Сервер, Порт);
ЗапросHTTP = Новый HTTPЗапрос("/v1/statement", Заголовок);
ЗапросHTTP.УстановитьТелоИзСтроки("SELECT * FROM reports.work_sale_mechanic");
Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
Если Ответ.КодСостояния = 200 Тогда
// Обрабатываем JSON с результатами
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Результат = ПрочитатьJSON(ЧтениеJSON);
КонецЕсли;
Подводя итог, проанализируем последовательность действий при возникновении проблем с подключением к Hadoop:
Presto требует идентификации пользователя в заголовках запроса.COM-компонентов и делает решение более кроссплатформенным (что актуально при использовании серверов 1С на Linux).Соблюдение этих рекомендаций позволит вам создать стабильный и производительный механизм обмена данными между 1С и Hadoop, избегая распространенных ошибок конфигурации.