Перенос данных из внешних информационных систем, таких как MS SQL, Oracle или PostgreSQL, в среду 1С — это задача, которая часто возникает при автоматизации крупных предприятий или при необходимости миграции со старых систем. Хотя «Конвертация данных 2.1» (КД 2.1) изначально создавалась для обмена между базами 1С, её гибкость позволяет эффективно использовать этот инструмент и для работы со сторонними СУБД. В этой статье мы подробно разберем, как реализовать такой механизм, почему он остается актуальным и в каких случаях он выигрывает у современных «Внешних источников данных».
Рассмотрим основной способ взаимодействия с внешней базой. Поскольку КД 2.1 не умеет «напрямую» видеть таблицы Oracle или SQL как объекты метаданных 1С, мы будем использовать программный доступ. Основная логика выгрузки будет сосредоточена в Правилах выгрузки данных (ПВД).
Проанализируем шаги, которые необходимо выполнить:
Перед выгрузкой данных напишем код подключения к внешней базе и выборку данных.Разберем пример кода для подключения к базе 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 есть штатный механизм Внешних источников данных? Выясним причины, по которым КД всё еще актуальна:
Если во внешней базе находятся миллионы записей, выгрузка через ВыгрузитьПоПравилу() в одном цикле может привести к переполнению памяти. Посмотрим, как оптимизировать этот процесс:
Порционная выгрузка: Вместо одного огромного запроса к СУБД, используйте конструкцию SELECT ... OFFSET ... FETCH NEXT ... (для SQL) или аналогичные механизмы пагинации в Oracle. Выгружайте данные порциями по 1000–5000 объектов.
Использование временных файлов: При работе с КД 2.1 конечный результат — это XML-файл. Если данных слишком много, платформа может «споткнуться» на формировании огромного текстового документа. В таких случаях рекомендуем разбивать обмен на несколько файлов по категориям данных или периодам.
Использование «Конвертации данных 2.1» для обмена с внешними базами — это проверенная и надежная практика, которая особенно эффективна для систем на обычных формах или в случаях, когда нельзя менять структуру конфигурации 1С. Основная мощь метода заключается в использовании ПВД с произвольным алгоритмом и функции ВыгрузитьПоПравилу(), что позволяет превратить любые структурированные данные из Oracle или SQL в полноценные объекты 1С с сохранением всех бизнес-правил и проверок.