Как организовать автоматическую выгрузку данных из 1С в промежуточную базу MS SQL и на сайт?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции учетной системы 1С с корпоративным сайтом или интернет-магазином часто возникает необходимость создания промежуточной базы данных (обычно на MS SQL). Такой подход позволяет решить сразу несколько важнейших задач: изолировать рабочую базу 1С от прямых запросов из интернета ради безопасности, снизить нагрузку на основную систему и структурировать данные в удобном для веб-сервера формате.

В этой статье мы подробно разберем, как правильно организовать автоматический периодический обмен данными между 1С и внешней базой MS SQL, проанализируем различные инструменты и приведем конкретные примеры кода.

---

Вариант 1. Выгрузка через XML/JSON файлы и регламентные задания

Это классический и один из самых распространенных способов интеграции. Суть метода заключается в том, что по расписанию запускается РегламентноеЗадание, которое собирает нужные данные в 1С, формирует файл обмена и отправляет его на сервер (или кладет в общую сетевую папку), где планировщик сайта его считывает и импортирует.

Разберем по шагам, как сформировать XML-файл в 1С на примере выгрузки справочника контрагентов или организаций. Для этого мы используем встроенные объекты платформы ЗаписьXML.


// Создаем объект для записи XML-документа
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл("d:\Temp\ExportOrganizations.xml", "UTF-8"); // Открываем файл и задаем кодировку
ЗаписьXML.ЗаписатьОбъявлениеXML();  // Записываем стандартный заголовок <?xml version="1.0" encoding="utf-8"?>

ЗаписьXML.ЗаписатьНачалоЭлемента("Организации"); // Открываем корневой тег

// Выбираем данные из базы 1С
Выборка = Справочники.Организации.Выбрать();
Пока Выборка.Следующий() Цикл  
    
    // Для каждого элемента формируем отдельный узел
    ЗаписьXML.ЗаписатьНачалоЭлемента("Организация"); 
    
    // Записываем реквизиты в виде атрибутов тега
    ЗаписьXML.ЗаписатьАтрибут("Код", Строка(Выборка.Код));
    ЗаписьXML.ЗаписатьАтрибут("Наименование", Строка(Выборка.Наименование));
    
    // Если нужно записать ИНН или КПП внутрь элемента
    ЗаписьXML.ЗаписатьНачалоЭлемента("ИНН");
    ЗаписьXML.ЗаписатьТекст(Строка(Выборка.ИНН));
    ЗаписьXML.ЗаписатьКонецЭлемента(); // ИНН
    
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Организация
    
КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем корневой тег Организации
ЗаписьXML.Закрыть(); // Закрываем файл и сохраняем изменения на диск

Для простых сценариев сериализации одиночных объектов можно использовать и более быстрый платформенный метод, например, Общегоназначения.ЗначениеВСтрокуXML() или стандартные механизмы XML-сериализации объектов 1С.

Важное примечание: Хотя XML исторически популярен, в современной разработке его все чаще вытесняет формат JSON. Объекты ЗаписьJSON и ЧтениеJSON работают аналогичным образом, но файлы получаются значительно меньше по объему, а веб-серверы и СУБД парсят их в разы быстрее.

---

Вариант 2. Прямая запись во внешнюю базу MS SQL через ADO

Если вам нужно передавать данные максимально быстро, минуя промежуточное сохранение в файлы и их последующий парсинг, оптимальным выбором станет прямая запись в таблицы MS SQL. Для этого в среде Windows отлично подходит технология ADO (ActiveX Data Objects), доступная в 1С через COM-объекты.

Рассмотрим подробнее пример кода, который подключается к внешней базе MS SQL и выполняет прямую запись данных:


// Инициализируем COM-объект для подключения к СУБД
Connection = Новый COMОбъект("ADODB.Connection");
Command    = Новый COMОбъект("ADODB.Command");

// Строка подключения к вашей внешней базе данных SQL
ConnectionString = "Provider=SQLOLEDB;Data Source=SQL_SERVER_NAME;Initial Catalog=ExternalSiteDB;User ID=db_user;Password=db_password;";

Попытка
    Connection.Open(ConnectionString);
Исключение
    Сообщить("Не удалось подключиться к базе MS SQL! Ошибка: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Настраиваем команду выполнения запроса
Command.ActiveConnection = Connection;

// Пример записи новой записи во внешнюю таблицу товаров
ВыборкаТоваров = Справочники.Номенклатура.Выбрать();
Пока ВыборкаТоваров.Следующий() Цикл
    
    // Пропускаем группы товаров
    Если ВыборкаТоваров.ЭтоГруппа Тогда
        Продолжить;
    КонецЕсли;
    
    КодТовара  = ВыборкаТоваров.Код;
    ИмяТовара  = ВыборкаТоваров.Наименование;
    ЦенаТовара = ВыборкаТоваров.Цена; // Предположим, что цена хранится в реквизите
    
    // Формируем SQL-запрос (для безопасности лучше использовать параметры, но для простоты покажем прямую сборку строки)
    QueryText = "INSERT INTO dbo.SiteProducts (ProductCode, ProductName, Price) 
                |VALUES ('" + КодТовара + "', '" + СтрЗаменить(ИмяТовара, "'", "''") + "', " + СтрЗаменить(Строка(ЦенаТовара), ",", ".") + ")";
    
    Command.CommandText = QueryText;
    
    Попытка
        Command.Execute();
    Исключение
        Сообщить("Ошибка при записи товара с кодом " + КодТовара + ": " + ОписаниеОшибки());
    КонецПопытки;

КонецЦикла;

// Закрываем соединение с сервером
Connection.Close();

Преимущества прямого SQL:

  1. Высокая скорость: данные передаются мгновенно напрямую в таблицы СУБД.
  2. Нет накладных расходов на создание, передачу и чтение XML/JSON файлов.
  3. Возможность вызывать хранимые процедуры (Stored Procedures) на стороне MS SQL, что позволяет переложить логику обработки данных на саму СУБД.

---

Вариант 3. Использование Внешних источников данных (ВИД)

Начиная с версии платформы 8.2.14 и в современных версиях 8.3, в 1С реализован мощный механизм — Внешние источники данных. Он позволяет подключить таблицы внешней базы MS SQL непосредственно в дерево метаданных вашей конфигурации.

Проанализируем этот подход по шагам:

  1. В конфигураторе 1С в ветке "Внешние источники данных" добавляется новый источник.
  2. Настраивается подключение через установленный в операционной системе драйвер ODBC (например, SQL Server Native Client).
  3. Выбираются таблицы внешней базы данных, которые проецируются на объекты 1С.
  4. В коде 1С вы можете работать с этими таблицами так же, как со стандартными справочниками или документами: использовать объектные методы СоздатьОбъект(), записывать данные, а также использовать эти таблицы в стандартных запросах 1С.

Пример записи через механизм Внешних источников данных:


// Пример записи новой записи во внешнюю таблицу через ВИД
НоваяСтрока = ВнешниеИсточникиДанных.ВнешняяБазаSQL.Таблицы.dbo_SiteProducts.СоздатьОбъект();
НоваяСтрока.ProductCode = "000000123";
НоваяСтрока.ProductName = "Телевизор LED 40'";
НоваяСтрока.Price       = 25000;

Попытка
    НоваяСтрока.Записать();
Исключение
    Сообщить("Ошибка сохранения во внешний источник: " + ОписаниеОшибки());
КонецПопытки;

---

Как избежать падения производительности: Планы обмена

Большой ошибкой при реализации обмена является полная выгрузка всей базы при каждом запуске регламентного задания (как показано в простейших примерах выборки). При росте объема данных такой обмен быстро начнет "вешать" и 1С, и промежуточную базу SQL.

Чтобы выгружать только то, что изменилось с момента предыдущего обмена, необходимо задействовать механизм Планов обмена:

  1. Создаем в конфигураторе новый ПланОбмена (например, "ОбменСПромежуточнойБазой").
  2. В составе плана обмена указываем те объекты (справочники, документы, регистры сведений), изменения которых нам нужно отслеживать.
  3. При изменении или записи объекта в 1С платформа автоматически зарегистрирует изменения по этому узлу обмена.
  4. В регламентном задании мы выбираем только зарегистрированные изменения, выгружаем их во внешнюю базу MS SQL и затем вызываем метод ПланыОбмена.УдалитьРегистрациюИзменений().

---

Вопросы безопасности и лицензионной политики 1С

При проектировании такой архитектуры обязательно учитывайте два важнейших правила:

← На главную