При интеграции различных учетных систем часто возникает задача переноса данных. В нашем случае, необходимо наладить обмен между платформой "Гедымин", работающей на СУБД Firebird, и "1С:Предприятие 8.3". Проанализируем ситуацию и разберем несколько эффективных способов решения этой задачи, от самых простых до наиболее современных и гибких.
Выбор конкретного метода будет зависеть от ваших требований к скорости обмена, объему данных и сложности бизнес-логики. Рассмотрим подробнее каждый из подходов.
Это самый быстрый способ получить данные, так как мы обращаемся к базе данных "Гедымин" напрямую, минуя ее прикладной уровень. Этот метод идеально подходит для разовых выгрузок или когда требуется максимальная производительность при чтении больших объемов информации. Разберем по шагам, как это организовать.
Установка драйвера. На компьютер, где будет выполняться код 1С (сервер 1С или клиентский компьютер), необходимо установить ODBC-драйвер для Firebird. Без него 1С не сможет "понять", как взаимодействовать с этой СУБД.
Подключение из 1С. В 1С для работы с внешними источниками данных используется технология ADO (ActiveX Data Objects). Нам нужно будет создать COM-объект ADODB.Connection и сформировать для него строку подключения.
Формирование строки подключения. Строка подключения — это ключ к базе данных. Она должна содержать всю необходимую информацию: имя драйвера, путь к файлу базы данных, IP-адрес сервера, порт, а также логин и пароль.
Посмотрим на пример кода для подключения из 1С:
// Создаем COM-объект для подключения
Попытка
СоединениеADO = Новый COMОбъект("ADODB.Connection");
Исключение
Сообщить("Не удалось создать объект ADODB.Connection. Проверьте, установлены ли компоненты MDAC.");
Возврат;
КонецПопытки;
// Формируем строку подключения. Параметры нужно заменить на ваши.
СтрокаПодключения = "Driver={Firebird/InterBase(r) driver};"
+ "Dbname=192.168.1.100:C:\Gedemin\Data\MY_BASE.FDB;" // IP-адрес сервера и путь к файлу базы
+ "UID=SYSDBA;" // Имя пользователя
+ "PWD=masterkey;"; // Пароль
// Открываем соединение
Попытка
СоединениеADO.Open(СтрокаПодключения);
Исключение
Сообщить("Не удалось подключиться к базе данных Firebird! " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Теперь можно выполнять SQL-запросы
// ...
Выполнение SQL-запросов. После успешного подключения мы можем выполнять стандартные SQL-запросы к таблицам "Гедымин" и получать данные с помощью объекта ADODB.Recordset.
Важные моменты, которые нужно учесть:
Структура таблиц. Платформа "Гедымин" позволяет гибко настраивать структуру базы данных. Это означает, что стандартная документация по структуре таблиц может не соответствовать вашей реальной, кастомизированной базе. Перед написанием запросов придется тщательно изучить актуальную схему данных.
Бизнес-логика. При прямом чтении мы полностью игнорируем бизнес-логику, заложенную в "Гедымин". Это может привести к получению "сырых" или неконсистентных данных, которые требуют дополнительной обработки и проверки в 1С.
Файловый обмен — это классический и надежный способ интеграции. Одна система выгружает данные в файл определенного формата, а вторая система загружает данные из этого файла. Платформа "Гедымин" имеет встроенные средства для выгрузки данных в формат JSON, что делает этот способ достаточно удобным.
Выгрузка из "Гедымин". На стороне "Гедымин" настраивается или разрабатывается скрипт, который формирует JSON-файл с нужными данными (например, справочники, документы за период). Эту выгрузку можно выполнять по расписанию.
Передача файла. Файл помещается в общую сетевую папку, доступную для сервера 1С.
Загрузка в 1С. На стороне 1С настраиваем РегламентноеЗадание, которое с определенной периодичностью проверяет наличие нового файла в папке обмена. Если файл найден, 1С читает его, разбирает (парсит) структуру JSON и на основе полученных данных создает или обновляет объекты в своей базе.
Посмотрим на пример кода для чтения JSON-файла в 1С:
// Путь к файлу, выгруженному из Гедымин
ПутьКФайлу = "\\server\share\export.json";
// Читаем текстовый файл
ТекстовыйДокумент = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
СтрокаJSON = ТекстовыйДокумент.Прочитать();
ТекстовыйДокумент.Закрыть();
// Преобразуем (десериализуем) строку JSON в объекты 1С (Массив, Структура)
ДанныеИзФайла = Неопределено;
Попытка
// Используем встроенный механизм работы с JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
ДанныеИзФайла = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Исключение
Сообщить("Ошибка при разборе JSON-файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Теперь переменная ДанныеИзФайла содержит данные,
// с которыми можно работать: обходить в цикле, создавать объекты и т.д.
Для Каждого Элемент Из ДанныеИзФайла.Номенклатура Цикл
// ... логика создания или обновления номенклатуры в 1С
КонецЦикла;
Этот метод хорош своей простотой и надежностью, но он не подходит для обмена данными в режиме реального времени.
Это наиболее современный и гибкий подход, который позволяет организовать обмен данными практически в реальном времени. Идея заключается в том, чтобы "научить" системы общаться друг с другом напрямую по сети с помощью HTTP-запросов, как это делают современные веб-сайты и приложения.
Выясним причину, почему этот метод предпочтительнее для регулярного обмена. Он позволяет запрашивать только нужные данные и только тогда, когда они нужны, что снижает нагрузку на сеть и системы.
Создание API на стороне "Гедымин". Платформа "Гедымин" имеет встроенный веб-сервер. Мы можем написать на ее внутреннем языке (VBScript) скрипты-обработчики, которые будут "слушать" определенные веб-адреса. При поступлении HTTP-запроса от 1С такой скрипт выполняет SQL-запрос к базе, формирует ответ в формате JSON и отправляет его обратно в 1С.
Отправка запросов из 1С. В 1С мы используем объекты HTTPСоединение и HTTPЗапрос для отправки запросов на веб-сервер "Гедымин" и получения ответа.
Посмотрим на пример кода 1С для получения данных по API:
// Параметры сервера Гедымин
ИмяСервера = "gedemin.server.local";
Порт = 8080;
// Создаем безопасное соединение, если используется HTTPS
// ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
// Соединение = Новый HTTPСоединение(ИмяСервера, Порт, , , , , ЗащищенноеСоединение);
Соединение = Новый HTTPСоединение(ИмяСервера, Порт);
// Формируем запрос, например, для получения списка товаров
АдресРесурса = "/api/getProducts?category=123";
Запрос = Новый HTTPЗапрос(АдресРесурса);
// Отправляем GET-запрос
Попытка
Ответ = Соединение.Получить(Запрос);
Исключение
Сообщить("Ошибка при выполнении HTTP-запроса: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Проверяем, что запрос выполнен успешно
Если Ответ.КодСостояния = 200 Тогда // 200 - OK
СтрокаJSON = Ответ.ПолучитьТелоКакСтроку();
// Дальнейшая логика аналогична разбору JSON из файла (см. Решение 2)
// ...
Иначе
Сообщить("Сервер вернул ошибку. Код: " + Ответ.КодСостояния);
КонецЕсли;
Этот подход позволяет не только запрашивать данные из 1С (pull-модель), но и настроить "Гедымин" так, чтобы он сам отправлял уведомления (push-уведомления или веб-хуки) в 1С при возникновении определенных событий, например, при создании нового документа. Это делает интеграцию максимально оперативной.
Кроме рассмотренных основных методов, существуют и другие, более специфические способы интеграции:
ВнешнийИсточникДанных. Это позволит работать с таблицами "Гедымин" почти как с обычными таблицами 1С, используя язык запросов 1С.Таким образом, мы рассмотрели несколько рабочих подходов. Для разовых или нечастых обменов отлично подойдет прямое подключение к базе или файловый обмен. Для регулярной и оперативной интеграции лучшим выбором будет организация обмена через веб-сервисы.
← К списку