Как настроить обмен данными между внешними СУБД и 1С при помощи Конвертации данных 2.1?

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

Перенос данных из внешних информационных систем, таких как MS SQL, Oracle или PostgreSQL, в среду 1С — это задача, которая часто возникает при автоматизации крупных предприятий или при необходимости миграции со старых систем. Хотя «Конвертация данных 2.1» (КД 2.1) изначально создавалась для обмена между базами 1С, её гибкость позволяет эффективно использовать этот инструмент и для работы со сторонними СУБД. В этой статье мы подробно разберем, как реализовать такой механизм, почему он остается актуальным и в каких случаях он выигрывает у современных «Внешних источников данных».

Механизм реализации: Правила выгрузки данных с произвольным алгоритмом

Рассмотрим основной способ взаимодействия с внешней базой. Поскольку КД 2.1 не умеет «напрямую» видеть таблицы Oracle или SQL как объекты метаданных 1С, мы будем использовать программный доступ. Основная логика выгрузки будет сосредоточена в Правилах выгрузки данных (ПВД).

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

  1. Создадим в КД 2.1 новое Правило выгрузки данных.
  2. Установим тип реализации — «Произвольный алгоритм».
  3. В обработчике события Перед выгрузкой данных напишем код подключения к внешней базе и выборку данных.

Разберем пример кода для подключения к базе Oracle через COM-объект ADODB. Этот метод универсален и подходит для большинства СУБД, достаточно лишь изменить строку подключения (Connection String).


// Создаем соединение с внешней базой
Connection = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={Oracle in OraClient11g_home1};Dbq=ИмяБазы;Uid=Логин;Pwd=Пароль;";

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

// Выполняем SQL-запрос
RecordSet = Connection.Execute("SELECT ID, NAME, PRICE FROM EXTERNAL_TABLE");

Пока RecordSet.EOF() = 0 Цикл
    // Формируем структуру, имитирующую объект-источник
    ДанныеИсточника = Новый Структура;
    ДанныеИсточника.Вставить("External_ID", Строка(RecordSet.Fields("ID").Value));
    ДанныеИсточника.Вставить("Наименование", Строка(RecordSet.Fields("NAME").Value));
    ДанныеИсточника.Вставить("Цена", RecordSet.Fields("PRICE").Value);
    
    // Передаем данные в ПКО
    ВыгрузитьПоПравилу(ДанныеИсточника, , , , "ИмяВашегоПКО");
    
    RecordSet.MoveNext();
КонецЦикла;

Connection.Close();

В данном примере функция ВыгрузитьПоПравилу() является ключевой. Она получает нашу структуру и ищет соответствующее Правило конвертации объектов (ПКО), чтобы превратить эти «плоские» данные в полноценный объект 1С (справочник или документ).

Настройка ПКО для работы с внешними данными

Теперь выясним, как настроить само ПКО. Поскольку источника в метаданных 1С у нас нет, ПКО настраивается особым образом:

Важный момент: Так как у объектов во внешних базах нет внутреннего уникального идентификатора 1С (GUID), нам необходимо настроить Поля поиска. Выберем уникальный идентификатор из внешней базы (например, первичный ключ ID) и в ПКС для соответствующего реквизита 1С установим флаг «Поиск». В обработчике Поля поиска мы можем дополнительно описать логику сопоставления, если она сложнее, чем простое равенство.

Синхронизация и иерархия данных

При работе с реляционными базами данных (где данные распределены по нескольким связанным таблицам) мы часто сталкиваемся со сложными связями. Рассмотрим ситуацию, когда нам нужно выгрузить документ и его табличную часть из разных таблиц СУБД.

Проанализируем подход с использованием Входящих данных. В КД 2.1 мы можем в ПВД собрать структуру, содержащую не только реквизиты шапки, но и массив структур для табличной части. В ПКС, отвечающем за табличную часть, мы укажем, что данные нужно брать из этого массива. Это избавляет нас от необходимости делать повторные запросы к СУБД внутри ПКО, что значительно ускоряет процесс.

Сравнение с Внешними источниками данных (ВИД)

Многие разработчики задаются вопросом: зачем использовать КД 2.1, если в платформе 8.3 есть штатный механизм Внешних источников данных? Выясним причины, по которым КД всё еще актуальна:

  1. Поддержка старых конфигураций: Если ваша база работает на обычных формах (например, старая УПП или самописная конфигурация на 8.2), полноценная работа с ВИД может быть ограничена или невозможна.
  2. Отсутствие изменений в конфигурации: Использование ВИД требует внесения изменений в метаданные (добавление нового объекта «Внешний источник данных»). КД 2.1 работает через внешнюю обработку и файлы правил, не требуя снятия конфигурации с поддержки.
  3. Сложная трансформация: В КД 2.1 гораздо удобнее описывать маппинг полей и сложную логику преобразования типов данных «на лету» через обработчики событий.
  4. Работа с 64-битными серверами: Использование COM-соединений напрямую из кода 1С может вызвать сложности с драйверами, тогда как КД позволяет вынести логику выгрузки в отдельный клиентский процесс или регламентное задание с нужными настройками окружения.

Оптимизация производительности при больших объемах

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

Порционная выгрузка: Вместо одного огромного запроса к СУБД, используйте конструкцию SELECT ... OFFSET ... FETCH NEXT ... (для SQL) или аналогичные механизмы пагинации в Oracle. Выгружайте данные порциями по 1000–5000 объектов.

Использование временных файлов: При работе с КД 2.1 конечный результат — это XML-файл. Если данных слишком много, платформа может «споткнуться» на формировании огромного текстового документа. В таких случаях рекомендуем разбивать обмен на несколько файлов по категориям данных или периодам.

Резюме

Использование «Конвертации данных 2.1» для обмена с внешними базами — это проверенная и надежная практика, которая особенно эффективна для систем на обычных формах или в случаях, когда нельзя менять структуру конфигурации 1С. Основная мощь метода заключается в использовании ПВД с произвольным алгоритмом и функции ВыгрузитьПоПравилу(), что позволяет превратить любые структурированные данные из Oracle или SQL в полноценные объекты 1С с сохранением всех бизнес-правил и проверок.

← На главную