При интеграции учетной системы 1С с корпоративным сайтом или интернет-магазином часто возникает необходимость создания промежуточной базы данных (обычно на MS SQL). Такой подход позволяет решить сразу несколько важнейших задач: изолировать рабочую базу 1С от прямых запросов из интернета ради безопасности, снизить нагрузку на основную систему и структурировать данные в удобном для веб-сервера формате.
В этой статье мы подробно разберем, как правильно организовать автоматический периодический обмен данными между 1С и внешней базой MS SQL, проанализируем различные инструменты и приведем конкретные примеры кода.
---
Это классический и один из самых распространенных способов интеграции. Суть метода заключается в том, что по расписанию запускается РегламентноеЗадание, которое собирает нужные данные в 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 работают аналогичным образом, но файлы получаются значительно меньше по объему, а веб-серверы и СУБД парсят их в разы быстрее.
---
Если вам нужно передавать данные максимально быстро, минуя промежуточное сохранение в файлы и их последующий парсинг, оптимальным выбором станет прямая запись в таблицы 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:
---
Начиная с версии платформы 8.2.14 и в современных версиях 8.3, в 1С реализован мощный механизм — Внешние источники данных. Он позволяет подключить таблицы внешней базы MS SQL непосредственно в дерево метаданных вашей конфигурации.
Проанализируем этот подход по шагам:
СоздатьОбъект(), записывать данные, а также использовать эти таблицы в стандартных запросах 1С.Пример записи через механизм Внешних источников данных:
// Пример записи новой записи во внешнюю таблицу через ВИД
НоваяСтрока = ВнешниеИсточникиДанных.ВнешняяБазаSQL.Таблицы.dbo_SiteProducts.СоздатьОбъект();
НоваяСтрока.ProductCode = "000000123";
НоваяСтрока.ProductName = "Телевизор LED 40'";
НоваяСтрока.Price = 25000;
Попытка
НоваяСтрока.Записать();
Исключение
Сообщить("Ошибка сохранения во внешний источник: " + ОписаниеОшибки());
КонецПопытки;
---
Большой ошибкой при реализации обмена является полная выгрузка всей базы при каждом запуске регламентного задания (как показано в простейших примерах выборки). При росте объема данных такой обмен быстро начнет "вешать" и 1С, и промежуточную базу SQL.
Чтобы выгружать только то, что изменилось с момента предыдущего обмена, необходимо задействовать механизм Планов обмена:
ПланОбмена (например, "ОбменСПромежуточнойБазой").ПланыОбмена.УдалитьРегистрациюИзменений().---
При проектировании такой архитектуры обязательно учитывайте два важнейших правила: