При внедрении сторонних систем, таких как СУС (WMS), часто возникает задача организовать обмен данными через транзитную базу на стороне MS SQL Server. В рамках данной статьи мы подробно разберем, как реализовать чтение и запись данных напрямую из 1С, проанализируем возможности встроенных механизмов платформы и рассмотрим альтернативные подходы, обеспечивающие высокую производительность и надежность.
Рассмотрим основной и наиболее современный способ взаимодействия с внешними СУБД — использование объектов метаданных типа ВнешниеИсточникиДанных. Этот механизм позволяет работать с таблицами сторонней базы данных практически так же, как со стандартными справочниками или документами 1С.
Многие разработчики ошибочно полагают, что внешние источники предназначены только для чтения. Разберем по шагам, как настроить полноценную запись во внешнюю базу:
uniqueidentifier в SQL Server должен правильно отображаться в УникальныйИдентификатор в 1С. Несоответствие типов — частая причина ошибок при попытке записи.Программная работа с внешними источниками выглядит следующим образом:
// Пример записи в таблицу внешнего источника
НоваяЗапись = ВнешниеИсточникиДанных.ТранзитнаяБазаWMS.Таблицы.ВходящиеЗаявки.СоздатьОбъект();
НоваяЗапись.ID = Новый УникальныйИдентификатор();
НоваяЗапись.НомерДокумента = "000001";
НоваяЗапись.ДатаДокумента = ТекущаяДата();
НоваяЗапись.КонтрагентНаименование = "ООО СкладСервис";
НоваяЗапись.Записать();
Важно помнить, что запись через объекты работает по принципу объектной техники 1С, что удобно, но может быть медленно при обработке десятков тысяч строк. В таких случаях мы рекомендуем использовать стандартные запросы 1С, которые также поддерживают работу с ВИД.
Если механизм ВИД кажется избыточным или требуется выполнение специфических команд 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С, используя механизм ВИД, хранимые процедуры можно подключать как функции и вызывать их напрямую из кода, что делает архитектуру обмена чистой и понятной.
Рассмотрим готовые решения, которые упоминались в обсуждении. Продукт «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) абсолютно легальна и не нарушает условий лицензионного соглашения.
Подводя итог, можно сказать, что для простых задач идеально подходят Внешние источники данных с включенным флагом редактирования. Для высоконагруженных систем со сложной логикой лучше использовать хранимые процедуры или интеграционные шины.