Как организовать запись данных из 1С в стороннюю базу SQL

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

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

Предварительный анализ структуры базы данных

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

Рассмотрим методы, которые помогут нам восстановить структуру связей:

  1. SQL Profiler (для MS SQL Server): Если у вас есть доступ к приложению, которое работает с этой базой, запустите профилировщик и создайте документ в «родном» интерфейсе. Мы увидим все INSERT запросы, их последовательность и значения полей.
  2. ER-диаграммы: Попробуем открыть базу через SQL Server Management Studio и построить диаграмму базы данных. Если в базе настроены Foreign Keys (внешние ключи), связи отобразятся автоматически.
  3. Изучение документации: Как правильно заметили участники обсуждения, важно детально изучить английский мануал на предмет обязательных полей (NOT NULL) и уникальных ключей.

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

Метод 1: Использование внешних источников данных

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

Разберем процесс настройки:

  1. В конфигураторе переходим в ветку Внешние источники данных и добавляем новый объект.
  2. Настраиваем строку подключения (через ODBC или Native Client).
  3. На вкладке «Таблицы» нажимаем «Добавить» и выбираем нужные таблицы из списка.
  4. 1С автоматически создаст описание полей и связей.

После этого мы можем писать код в 1С, используя стандартные методы. Посмотрим на пример добавления записи:


НоваяЗапись = ВнешниеИсточникиДанных.МояВнешняяБаза.Таблицы.Orders.СоздатьМенеджерЗаписи();
НоваяЗапись.OrderDate = ТекущаяДата();
НоваяЗапись.CustomerName = "ООО Ромашка";
НоваяЗапись.Amount = 1500;
НоваяЗапись.Записать();

Метод 2: Использование ADODB (COM-объект)

Если по каким-то причинам использование внешних источников невозможно (например, нужно выполнять очень сложные специфические запросы), воспользуемся объектом ADODB.Connection. Этот метод дает нам полную свободу действий через прямой SQL.

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


Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Provider=MSOLEDBSQL;Data Source=ServerName;Initial Catalog=BaseName;User ID=Login;Password=Pass;";

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

ТекстЗапроса = "INSERT INTO Orders (OrderDate, Customer, Total) VALUES ('20231027', 'Иванов П.П.', 5000)";

Попытка
    Connection.Execute(ТекстЗапроса);
    Сообщить("Данные успешно записаны!");
Исключение
    Сообщить("Ошибка выполнения запроса: " + ОписаниеОшибки());
КонецПопытки;

Connection.Close();

При использовании этого метода важно правильно выбрать провайдер. Рекомендуем использовать MSOLEDBSQL (современный драйвер от Microsoft), так как старый SQLOLEDB может некорректно работать с типами datetime2 и другими современными стандартами.

Обеспечение целостности данных и транзакции

Запись документа обычно подразумевает вставку данных в несколько таблиц. Мы должны гарантировать, что либо запишутся все части документа, либо ни одной. Для этого обязательно используем транзакции.

В случае с ADODB это выглядит так:


Connection.BeginTrans();
Попытка
    // Записываем шапку
    Connection.Execute(ТекстЗапросаШапка);
    // Записываем строки
    Connection.Execute(ТекстЗапросаСтроки);
    
    Connection.CommitTrans();
Исключение
    Connection.RollbackTrans();
    Сообщить("Ошибка записи. Транзакция отменена.");
КонецПопытки;

Нюансы типов данных и NULL

Проанализируем основные проблемы, возникающие при передаче данных между 1С и SQL:

  1. Формат Даты: В 1С пустая дата — это «0001-01-01». SQL Server часто не принимает такие значения. При записи пустой даты из 1С лучше передавать NULL или минимально допустимую дату SQL (1753-01-01).
  2. Тип NULL: Если поле в SQL-таблице допускает NULL, а в 1С у вас пустая строка или ноль, система может выдать ошибку логики. Явно проверяйте значения перед формированием запроса.
  3. Идентификаторы (Identity): Если в SQL поле ID является автоинкрементным (Identity), никогда не указывайте его в списке полей для INSERT. SQL сам сгенерирует это значение.

Рекомендации по безопасности

Для работы 1С с внешней базой создайте отдельного пользователя на уровне SQL-сервера. Не используйте учетную запись sa. Настройте права доступа (GRANT) только на те таблицы и операции (INSERT, UPDATE, SELECT), которые действительно необходимы для выполнения задачи. Это защитит остальные данные внешней базы от случайного повреждения или удаления.

Таким образом, запись во внешнюю базу — это процесс, требующий тщательной подготовки. Выбор между Внешними источниками данных и ADODB зависит от конкретных задач и требований к гибкости кода. В любом случае, приоритетом должна быть целостность данных и корректность типов.

← На главную