При интеграции 1С с внешними учетными или технологическими системами часто возникает задача прямой синхронизации: передать справочную информацию во внешнюю СУБД SQL и загрузить оттуда данные для формирования и проведения документов в 1С. Рассмотрим, подходит ли для этих целей конфигурация «Конвертация данных» (КД), а также разберем проверенные архитектурные решения и практические примеры кода для реализации обмена.
Выясним сразу: механизм «Конвертация данных» предназначен строго для обмена информацией между конфигурациями на платформе 1С (через XML, JSON или прямое COM-подключение к другой базе 1С). Конвертация данных опирается на метаданные объектов 1С, их структуру и правила заполнении. Если одна из баз не является реляционной структурой 1С (например, это произвольная СУБД Microsoft SQL Server, PostgreSQL или MySQL от стороннего ПО), использовать КД напрямую нельзя.
Для взаимодействия со сторонними базами данных используются два основных подхода:
ADODB.Connection.Разберем самый распространенный и гибкий способ обмена — прямое чтение и запись через технологии OLE DB / ADO. Этот метод не требует изменения структуры конфигурации и отлично подходит для периодической выгрузки и загрузки данных.
Обратите внимание: использование технологии COM/ADO доступно только в операционных системах семейства Windows. Если сервер 1С запущен под управлением Linux, данный COM-объект вызвать не удастся.
Посмотрим на пример кода подключения к серверу SQL, отправки запроса и удаления или обновления данных:
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=SQLOLEDB.1;Data Source=ИмяСервера\SQLEXPRESS;Initial Catalog=ИмяБазыSQL;User ID=sa;Password=Пароль;";
Попытка
Соединение.Open(СтрокаПодключения);
Исключение
Сообщить("Не удалось соединиться с базой SQL: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Пример выполнения произвольного команды SQL (запись, обновление или удаление)
ЗапросSQL = "UPDATE Clients SET Status = 1 WHERE Processed = 0";
Попытка
Соединение.Execute(ЗапросSQL);
Исключение
Сообщить("Ошибка выполнения запроса SQL: " + ОписаниеОшибки());
КонецПопытки;
Соединение.Close();
Рассмотрим пример чтения данных из базы SQL для последующего создания документов в 1С:
Соединение = Новый COMОбъект("ADODB.Connection");
Command = Новый COMОбъект("ADODB.Command");
Попытка
Соединение.Open(СтрокаПодключения);
Command.ActiveConnection = Соединение;
Command.CommandText = "SELECT Id, ClientName, Amount FROM Orders WHERE Status = 'New'";
Записи = Command.Execute();
Пока НЕ Записи.EOF() Цикл
// Извлекаем значения полей таблицы SQL
Идентификатор = Записи.Fields("Id").Value;
ИмяКлиента = Записи.Fields("ClientName").Value;
Сумма = Записи.Fields("Amount").Value;
// Создаем документ в 1С
ДокументОбъект = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДата();
ДокументОбъект.СуммаДокумента = Сумма;
ДокументОбъект.Комментарий = "Загружено из SQL. ID: " + Строка(Идентификатор);
НачатьТранзакцию();
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
ЗафиксироватьТранзакцию();
// Отмечаем запись во внешней базе как обработанную
Соединение.Execute("UPDATE Orders SET Status = 'Processed' WHERE Id = " + Строка(Идентификатор));
Исключение
ОтменитьТранзакцию();
Сообщить("Не удалось провести документ: " + ОписаниеОшибки());
КонецПопытки;
Записи.MoveNext();
КонецЦикла;
Записи.Close();
Соединение.Close();
Исключение
Сообщить("Ошибка обработки данных: " + ОписаниеОшибки());
КонецПопытки;
Платформа 1С:Предприятие позволяет подключать внешние таблицы SQL непосредственно в конфигураторе через ветку метаданных «Внешние источники данных». В этом случае таблицы сторонней базы отображаются в 1С аналогично привычным справочникам и документам, и к ним можно обращаться с помощью языка запросов 1С или через объектную модель.
Рассмотрим особенности использования Внешних источников данных:
unixODBC).uniqueidentifier или varbinary) корректно отображаются в 1С. В таких случаях на стороне SQL создают VIEW (представления), приводящие типы к стандартным строкам или числам.Для того чтобы обмен выполнялся автоматически по расписанию без участия пользователя, в 1С применяются Регламентные задания.
Проанализируем специфику выполнения регламентных заданий в зависимости от режима работы базы 1С:
Рекомендуется всегда оборачивать операции записи документов 1С и обновления статусов в базе SQL в блоки Попытка ... Исключение и явные транзакции 1С (НачатьТранзакцию(), ЗафиксироватьТранзакцию()), чтобы избежать рассогласования данных при сбоях связи.