Интеграция 1С с внешними информационными системами на уровне базы данных — это ответственная задача, требующая не только знания встроенного языка 1С, но и понимания архитектуры SQL. В данной статье мы разберем по шагам, как правильно организовать запись данных во внешнюю SQL-базу, проанализируем доступные инструменты и выясним, каких ошибок стоит избегать.
Прежде чем писать первый запрос, нам необходимо четко понимать, куда именно мы записываем данные. Если на руках имеется только описание полей (мануал), этого может быть недостаточно для понимания бизнес-логики сторонней системы. Проанализируем ситуацию: если мы записываем документ, он, скорее всего, состоит из «шапки» (одна строка в одной таблице) и «табличной части» (несколько строк в другой таблице, связанных по идентификатору).
Рассмотрим методы, которые помогут нам восстановить структуру связей:
INSERT запросы, их последовательность и значения полей.Foreign Keys (внешние ключи), связи отобразятся автоматически.NOT NULL) и уникальных ключей.Важный совет: Перед любыми экспериментами обязательно сделайте бэкап сторонней базы данных. Ошибки при прямой записи могут нарушить логику работы чужой системы.
Платформа 1С предоставляет штатный механизм для работы с SQL-базами — ВнешниеИсточникиДанных. Этот способ наиболее предпочтителен, так как он позволяет работать с таблицами SQL почти так же, как с привычными справочниками или документами 1С.
Разберем процесс настройки:
После этого мы можем писать код в 1С, используя стандартные методы. Посмотрим на пример добавления записи:
НоваяЗапись = ВнешниеИсточникиДанных.МояВнешняяБаза.Таблицы.Orders.СоздатьМенеджерЗаписи();
НоваяЗапись.OrderDate = ТекущаяДата();
НоваяЗапись.CustomerName = "ООО Ромашка";
НоваяЗапись.Amount = 1500;
НоваяЗапись.Записать();
Если по каким-то причинам использование внешних источников невозможно (например, нужно выполнять очень сложные специфические запросы), воспользуемся объектом 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();
Сообщить("Ошибка записи. Транзакция отменена.");
КонецПопытки;
Проанализируем основные проблемы, возникающие при передаче данных между 1С и SQL:
NULL или минимально допустимую дату SQL (1753-01-01).NULL, а в 1С у вас пустая строка или ноль, система может выдать ошибку логики. Явно проверяйте значения перед формированием запроса.ID является автоинкрементным (Identity), никогда не указывайте его в списке полей для INSERT. SQL сам сгенерирует это значение.Для работы 1С с внешней базой создайте отдельного пользователя на уровне SQL-сервера. Не используйте учетную запись sa. Настройте права доступа (GRANT) только на те таблицы и операции (INSERT, UPDATE, SELECT), которые действительно необходимы для выполнения задачи. Это защитит остальные данные внешней базы от случайного повреждения или удаления.
Таким образом, запись во внешнюю базу — это процесс, требующий тщательной подготовки. Выбор между Внешними источниками данных и ADODB зависит от конкретных задач и требований к гибкости кода. В любом случае, приоритетом должна быть целостность данных и корректность типов.