Как организовать прямой обмен данными между 1С и внешней базой MS SQL Server

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

При внедрении сторонних систем, таких как СУС (WMS), часто возникает задача организовать обмен данными через транзитную базу на стороне MS SQL Server. В рамках данной статьи мы подробно разберем, как реализовать чтение и запись данных напрямую из 1С, проанализируем возможности встроенных механизмов платформы и рассмотрим альтернативные подходы, обеспечивающие высокую производительность и надежность.

Механизм «Внешние источники данных» (ВИД)

Рассмотрим основной и наиболее современный способ взаимодействия с внешними СУБД — использование объектов метаданных типа ВнешниеИсточникиДанных. Этот механизм позволяет работать с таблицами сторонней базы данных практически так же, как со стандартными справочниками или документами 1С.

Многие разработчики ошибочно полагают, что внешние источники предназначены только для чтения. Разберем по шагам, как настроить полноценную запись во внешнюю базу:

  1. Определение первичного ключа: Это критически важное условие. Чтобы платформа 1С могла идентифицировать запись и изменять её, у таблицы в MS SQL Server обязательно должен быть определен первичный ключ (Primary Key). Если ключа нет, 1С подключит таблицу в режиме «только чтение».
  2. Настройка в конфигураторе: При добавлении таблицы во внешний источник данных необходимо зайти в её свойства и установить флаг «Разрешить редактирование».
  3. Сопоставление типов данных: Проанализируем соответствие типов. Например, тип uniqueidentifier в SQL Server должен правильно отображаться в УникальныйИдентификатор в 1С. Несоответствие типов — частая причина ошибок при попытке записи.

Программная работа с внешними источниками выглядит следующим образом:


// Пример записи в таблицу внешнего источника
НоваяЗапись = ВнешниеИсточникиДанных.ТранзитнаяБазаWMS.Таблицы.ВходящиеЗаявки.СоздатьОбъект();
НоваяЗапись.ID = Новый УникальныйИдентификатор();
НоваяЗапись.НомерДокумента = "000001";
НоваяЗапись.ДатаДокумента = ТекущаяДата();
НоваяЗапись.КонтрагентНаименование = "ООО СкладСервис";
НоваяЗапись.Записать();

Важно помнить, что запись через объекты работает по принципу объектной техники 1С, что удобно, но может быть медленно при обработке десятков тысяч строк. В таких случаях мы рекомендуем использовать стандартные запросы 1С, которые также поддерживают работу с ВИД.

Прямое взаимодействие через ADODB

Если механизм ВИД кажется избыточным или требуется выполнение специфических команд SQL, которые не поддерживает платформа (например, сложные JOIN с хинтами или специфические функции T-SQL), мы можем использовать прямое подключение через COMОбъект.

Разберем пример создания подключения и выполнения команды вставки:


// Создание соединения
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={SQL Server};Server=SERVER_NAME;Database=TransitDB;Uid=1C_User;Pwd=StrongPassword;";

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

// Выполнение команды вставки
SQLCommand = "INSERT INTO Orders (OrderNumber, OrderDate) VALUES ('" + НомерДок + "', GETDATE())";
Connection.Execute(SQLCommand);
Connection.Close();

Преимущество этого метода заключается в максимальной гибкости. Мы можем вызывать любые инструкции, включая запуск хранимых процедур и использование массовой вставки (Bulk Insert), что значительно ускоряет обмен при больших объемах данных.

Использование хранимых процедур для интеграции

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

  1. Безопасность структуры: 1С не нужно знать внутреннее устройство таблиц WMS. Процедура выступает в роли API.
  2. Целостность данных: Внутри процедуры можно реализовать сложные проверки и транзакционную логику, которую трудно обеспечить на стороне 1С.
  3. Производительность: SQL Server оптимизирует план выполнения процедуры, что быстрее, чем выполнение набора отдельных SQL-запросов.

В 1С, используя механизм ВИД, хранимые процедуры можно подключать как функции и вызывать их напрямую из кода, что делает архитектуру обмена чистой и понятной.

Специализированные инструменты: 2is и интеграционные шины

Рассмотрим готовые решения, которые упоминались в обсуждении. Продукт «2is: Интеграция» представляет собой удобную обертку над стандартными механизмами 1С. Он упрощает сопоставление метаданных и автоматизирует создание транспортного слоя.

Если же бюджет проекта позволяет использовать промышленные решения, стоит обратить внимание на Datareon ESB или официальное решение 1С:Шина. Эти системы работают на принципах асинхронного обмена сообщениями. Вместо прямой записи в базу, 1С отправляет сообщение в очередь, а шина гарантирует его доставку в целевую систему. Это исключает риски потери данных при кратковременном разрыве соединения с MS SQL Server.

Анализ рисков и критические рекомендации

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

1. Блокировки таблиц: Интенсивная запись из 1С может блокировать таблицы, необходимые для работы терминалов сбора данных (ТСД) на складе. Проанализируем ситуацию: если 1С делает длительную транзакцию, работа всего склада может встать. Рекомендуется использовать уровень изоляции READ UNCOMMITTED при чтении или настроить SNAPSHOT ISOLATION на уровне базы данных SQL.

2. Транзакционная целостность: Помните, что транзакция в 1С (НачатьТранзакцию()) никак не связана с транзакцией в MS SQL Server. Если после записи во внешнюю базу в 1С произойдет ошибка и откат транзакции, данные во внешней базе останутся. Рекомендуем использовать статусы сообщений (например, поле Status со значениями New, Processed, Error) для контроля обработки.

3. Лицензирование: Согласно лицензионной политике фирмы «1С», запись напрямую в таблицы базы данных самой 1С сторонними средствами запрещена. Однако запись из 1С во внешние базы (как в нашем случае с WMS) абсолютно легальна и не нарушает условий лицензионного соглашения.

Подводя итог, можно сказать, что для простых задач идеально подходят Внешние источники данных с включенным флагом редактирования. Для высоконагруженных систем со сложной логикой лучше использовать хранимые процедуры или интеграционные шины.

← На главную