Как программно автоматизировать перенос данных между базами 1С, используя универсальный обмен данными XML?

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

При работе с несколькими информационными базами 1С часто возникает необходимость в регулярном или автоматическом обмене данными. Например, перенос справочников, документов или остатков из одной конфигурации в другую. Стандартные инструменты 1С предоставляют мощную обработку «Универсальный обмен данными в формате XML», но ее ручное использование не всегда удобно для автоматизированных сценариев — для этого подойдёт регулярный обмен по правилам Конвертации 2.0. Мы с вами рассмотрим, как программно управлять этим процессом, чтобы сделать его полностью автоматическим и эффективным. Весь этот путь, от создания правил до настройки регламентного задания, можно пройти, следуя четкому алгоритму.

Прежде чем погружаться в код, давайте уясним важность двух ключевых составляющих успешного обмена: саму обработку «Универсальный обмен данными в формате XML» и, что еще более критично, правильно настроенные правила обмена.

Что такое Универсальный обмен данными в формате XML?

Обработка «Универсальный обмен данными в формате XML» (часто упоминаемая как УОД) — это штатный механизм платформы 1С, предназначенный для обмена данными между различными конфигурациями 1С, а также для выгрузки данных в сторонние системы или загрузки из них. Она позволяет гибко настраивать, какие объекты и по каким правилам должны быть выгружены или загружены. На базе этого механизма существуют и дополненные версии обработки, расширяющие ее стандартные возможности.

Роль и создание правил обмена

Правила обмена — это сердце любого обмена данными в 1С. Без них обработка УОД не знает, какие объекты нужно переносить, как их сопоставлять, трансформировать и что делать с несоответствиями. Правила обмена создаются в отдельной конфигурации — «Конвертация данных» (версии 2.0 или 3.0).

При создании правил мы указываем:

  1. Источники и приемники: Какие объекты из исходной базы соответствуют каким объектам в базе-приемнике (например, справочник «Номенклатура» в одной базе может быть сопоставлен с таким же справочником в другой).

  2. Правила выгрузки: Как данные должны быть выгружены из источника. Мы можем задавать отборы, фильтры, условия выгрузки.

  3. Правила загрузки: Как данные должны быть загружены в приемник. Здесь определяются алгоритмы поиска существующих объектов, создания новых, обновления реквизитов, обработки ссылочных данных.

  4. Дополнительные алгоритмы: Мы можем использовать встроенный язык 1С для написания сложных алгоритмов конвертации данных, например, для изменения значений реквизитов, формирования новых полей или сложной логики сопоставления.

Ключевой момент: имена параметров, которые мы планируем передавать программно (например, для отбора по периоду), должны быть четко определены в этих правилах обмена. Без этого программная передача параметров будет бесполезна. Изучение продвинутых техник параметризации правил является критически важным аспектом для создания по-настоящему гибких и управляемых обменов.

После создания правила сохраняются в виде XML-файла. Именно этот файл мы и будем использовать в нашем программном решении.

Программный вызов Универсального обмена данными: Общая концепция

Для программной работы с обработкой «Универсальный обмен данными в формате XML» мы не используем напрямую объект УниверсальныйОбменДанными как системный объект платформы. Вместо этого мы должны получить экземпляр этой обработки и работать с ее методами и свойствами. Это достигается через создание объекта типа Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать().

После получения объекта обработки, процесс программного обмена состоит из нескольких шагов:

  1. Создание экземпляра обработки: Получаем объект, представляющий нашу обработку.

  2. Загрузка правил обмена: Указываем путь к XML-файлу с правилами.

  3. Настройка параметров: Устанавливаем режим обмена (выгрузка или загрузка), пути к файлам выгрузки/загрузки, а также любые дополнительные параметры, определенные в правилах обмена (например, период выгрузки).

  4. Выполнение обмена: Запускаем процесс обмена данных.

Решение 1: Программная выгрузка данных

Рассмотрим пошагово, как осуществить программную выгрузку данных из вашей базы 1С. Мы будем использовать функцию, которая будет принимать путь к файлу правил обмена, путь, куда будет сохранен файл выгрузки, и необязательные параметры для отбора по периоду.

Шаг 1: Получение объекта обработки и загрузка правил

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


Функция ВыгрузитьДанные(ИмяФайлаПравил, ИмяФайлаВыгрузки, НачалоПериода = Неопределено, КонецПериода = Неопределено) Экспорт

    // Создаем экземпляр стандартной обработки для обмена данными.
    // Это позволяет нам получить доступ к ее методам и свойствам.
    ОбработкаОбъект = Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать();
    
    // Пытаемся загрузить правила обмена из указанного файла.
    // Если файл не найден или имеет некорректный формат, метод вернет Ложь.
    Если Не ОбработкаОбъект.ЗагрузитьПравилаОбменаИзФайла(ИмяФайлаПравил) Тогда
        // В случае ошибки загрузки правил, сообщаем об этом и прекращаем выполнение.
        Сообщить("Ошибка: Не удалось загрузить правила обмена из файла: " + ИмяФайлаПравил);
        Возврат Ложь;
    КонецЕсли;

Мы используем Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать() для получения объекта обработки. Затем методом ЗагрузитьПравилаОбменаИзФайла() мы указываем путь к XML-файлу с правилами. Важно убедиться, что путь к файлу правил корректен и файл доступен для чтения сервером 1С или клиентским приложением, в зависимости от контекста вызова.

Шаг 2: Настройка параметров выгрузки

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


// Устанавливаем имя файла, в который будут выгружены данные.
ОбработкаОбъект.ИмяФайлаВыгрузки = ИмяФайлаВыгрузки;
    
// Указываем, что обмен будет производиться по ранее загруженным правилам.
// Это ключевое свойство, определяющее логику работы обмена.
ОбработкаОбъект.ВыгружатьПоПравилам = Истина;
    
// Явно указываем режим обмена - "Выгрузка".
ОбработкаОбъект.РежимОбмена = "Выгрузка";

ИмяФайлаВыгрузки определяет полный путь к XML-файлу, который будет создан в результате выгрузки. Для обеспечения конфиденциальности передаваемых данных существуют решения, позволяющие производить универсальную выгрузку с возможностью шифрования — например, универсальная выгрузка через файл, HTTP и COM. ВыгружатьПоПравилам = Истина — это критически важное свойство, которое указывает обработке использовать загруженные правила. РежимОбмена = "Выгрузка" явно устанавливает направление операции.

Шаг 3: Передача параметров отбора (например, по периоду)

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


// Проверяем, были ли переданы параметры периода.
Если НачалоПериода <> Неопределено И КонецПериода <> Неопределено Тогда
    // Предполагаем, что в правилах обмена есть параметры
    // с именами "НачалоПериодаВыгрузки" и "КонецПериодаВыгрузки".
    // Эти имена должны ТОЧНО совпадать с именами параметров, заданных в Конвертации Данных!
    ОбработкаОбъект.ПараметрыВыгрузки.Вставить("НачалоПериодаВыгрузки", НачалоПериода);
    ОбработкаОбъект.ПараметрыВыгрузки.Вставить("КонецПериодаВыгрузки", КонецПериода);
КонецЕсли;

Свойство ПараметрыВыгрузки представляет собой коллекцию, в которую мы можем добавлять пары «ИмяПараметра» – «ЗначениеПараметра». Важно еще раз подчеркнуть, что если вы ошибетесь в названии параметра, обработка его не распознает, и отбор не сработает!

Шаг 4: Выполнение выгрузки

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


    // Запускаем процесс обмена данными.
    // В зависимости от режима (Выгрузка) и настроенных параметров,
    // данные будут выгружены в указанный файл.
    ОбработкаОбъект.ВыполнитьОбмен();

    // Если выполнение дошло до этой строки без исключений, считаем, что выгрузка успешна.
    Возврат Истина;

КонецФункции // ВыгрузитьДанные

Метод ВыполнитьОбмен() инициирует процесс обмена. Он будет читать правила, выполнять запросы, формировать XML-файл и сохранять его. В случае возникновения ошибок в процессе обмена, 1С обычно генерирует исключения, которые можно отловить блоком Попытка...Исключение для более надежной работы.

Пример вызова функции выгрузки

Чтобы использовать нашу функцию, нам нужно определить пути к файлам и, возможно, период:


// Определяем период для выгрузки - например, прошлый месяц.
Начало = НачалоМесяца(ДобавитьМесяц(ТекущаяДата(), -1));
Конец = КонецМесяца(ДобавитьМесяц(ТекущаяДата(), -1));

// Определяем пути к файлам правил и выгрузки.
// Убедитесь, что эти пути доступны для записи/чтения.
ИмяФайлаПравилОбмена = "C:\МоиПравилаУТ11.xml";
ИмяФайлаДляВыгрузки = "C:\ВыгрузкаУТ11_ПрошлыйМесяц.xml";

// Вызываем нашу функцию для выполнения выгрузки.
Если ВыгрузитьДанные(ИмяФайлаПравилОбмена, ИмяФайлаДляВыгрузки, Начало, Конец) Тогда
    Сообщить("Данные успешно выгружены в файл: " + ИмяФайлаДляВыгрузки);
Иначе
    Сообщить("Ошибка при выгрузке данных.");
КонецЕсли;

Решение 2: Программная загрузка данных

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

Шаг 1: Получение объекта обработки и загрузка правил

Начало функции для загрузки данных идентично: нам нужен экземпляр обработки и загруженные правила обмена. Правила обмена для загрузки могут быть теми же самыми, если они двусторонние, или отдельными, предназначенными специально для загрузки.


Функция ЗагрузитьДанные(ИмяФайлаПравил, ИмяФайлаЗагрузки) Экспорт

    ОбработкаОбъект = Обработки.УниверсальныйОбменДаннымиВФорматеXML.Создать();

    Если Не ОбработкаОбъект.ЗагрузитьПравилаОбменаИзФайла(ИмяФайлаПравил) Тогда
        Сообщить("Ошибка: Не удалось загрузить правила обмена из файла: " + ИмяФайлаПравил);
        Возврат Ложь;
    КонецЕсли;

Шаг 2: Настройка параметров загрузки

Здесь мы указываем файл, из которого будут загружаться данные, и устанавливаем режим обмена на «Загрузка».


// Устанавливаем имя файла, из которого будут загружаться данные.
ОбработкаОбъект.ИмяФайлаЗагрузки = ИмяФайлаЗагрузки;
    
// Для загрузки также указываем, что используем правила.
// Хотя свойство называется "ВыгружатьПоПравилам", оно общее для использования правил.
ОбработкаОбъект.ВыгружатьПоПравилам = Истина; 
    
// Явно устанавливаем режим обмена - "Загрузка". Это критически важно.
ОбработкаОбъект.РежимОбмена = "Загрузка"; 

Обратите внимание на ВыгружатьПоПравилам = Истина. Это свойство не является индикатором только выгрузки, а указывает на то, что обработка должна ориентироваться на загруженные правила обмена. Главное отличие здесь — это РежимОбмена = "Загрузка" и свойство ИмяФайлаЗагрузки.

Шаг 3: Выполнение загрузки

Запуск процесса загрузки осуществляется тем же методом, что и для выгрузки.


    // Запускаем процесс обмена данными.
    // В зависимости от режима (Загрузка), данные будут загружены из указанного файла.
    ОбработкаОбъект.ВыполнитьОбмен();

    Возврат Истина;

КонецФункции // ЗагрузитьДанные

Пример вызова функции загрузки

Для загрузки нам понадобится путь к файлу правил и путь к файлу с выгруженными данными:


// Определяем пути к файлам правил и ранее выгруженных данных.
ИмяФайлаПравилОбмена = "C:\МоиПравилаУТ11.xml";
ИмяФайлаДляЗагрузки = "C:\ВыгрузкаУТ11_ПрошлыйМесяц.xml";

// Вызываем нашу функцию для выполнения загрузки.
Если ЗагрузитьДанные(ИмяФайлаПравилОбмена, ИмяФайлаДляЗагрузки) Тогда
    Сообщить("Данные успешно загружены из файла: " + ИмяФайлаДляЗагрузки);
Иначе
    Сообщить("Ошибка при загрузке данных.");
КонецЕсли;

Дополнительные возможности и рекомендации

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

Передача дополнительных параметров в правила обмена

Помимо периода, вы можете передавать любые другие параметры, которые были настроены в ваших правилах обмена в «Конвертации данных». Это могут быть параметры, определяющие конкретные организации, склады, контрагентов или любые другие условия для выгрузки/загрузки данных. Например, если в правилах есть параметр КодОрганизации, вы можете передать его так:


// ...
ОбработкаОбъект.ПараметрыВыгрузки.Вставить("КодОрганизации", "001");
// ...

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

Обработка ошибок и логирование

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

Мы можем обернуть вызов ВыполнитьОбмен() в блок Попытка...Исключение:


Попытка
    ОбработкаОбъект.ВыполнитьОбмен();
    Возврат Истина;
Исключение
    ЗаголовокОшибки = "Ошибка при выполнении обмена: ";
    ОписаниеОшибки = ИнформацияОбОшибке().Описание;
    Сообщить(ЗаголовокОшибки + ОписаниеОшибки, СтатусСообщения.Важное);
    // Дополнительно можно записать ошибку в журнал регистрации
    ЗаписьЖурналаРегистрации(ЗаголовокОшибки, УровеньВажностиЖурналаСобытий.Ошибка, , , ОписаниеОшибки);
    Возврат Ложь;
КонецПопытки;

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

Автоматизация с помощью регламентных заданий

Для полноценной автоматизации обмена данные, как правило, выгружаются и загружаются по расписанию. Для этого в 1С используются Регламентные задания. Вы можете создать новое регламентное задание, которое будет вызывать вашу функцию ВыгрузитьДанные() или ЗагрузитьДанные() с заданной периодичностью. Кроме того, можно воспользоваться универсальным планировщиком обменов для настройки расписания без дополнительного программирования. Это позволит обмениваться данными, например, каждый час, раз в сутки или в определенное время без участия пользователя.

При настройке регламентного задания важно учитывать следующие моменты:

  1. Права пользователя: Пользователь, от имени которого выполняется регламентное задание, должен иметь достаточные права для создания/изменения объектов, чтения/записи файлов и работы с обработкой обмена.

  2. Пути к файлам: Пути к файлам правил и обмена должны быть доступны для сервера 1С. Обычно это сетевые пути или папки на диске сервера.

  3. Режим блокировки: При интенсивном обмене или больших объемах данных стоит рассмотреть вопрос о блокировках и их влиянии на работу пользователей. Возможно, обмен стоит запускать в часы наименьшей активности.

Использование относительных путей

Если ваша база данных часто перемещается или разворачивается в разных окружениях, использование абсолютных путей (например, "C:\...") может быть неудобным. Рассмотрим возможность использования относительных путей или путей, зависящих от параметров системы (например, через каталог временных файлов или каталог хранения файлов конфигурации):


// Пример использования относительного пути относительно каталога информационной базы
// Предполагаем, что файл правил находится в подкаталоге "Обмен" относительно каталога ИБ
КаталогБазы = КаталогБазыДанных();
ИмяФайлаПравилОбмена = КаталогБазы + "Обмен\МоиПравилаУТ11.xml";
ИмяФайлаДляВыгрузки = КаталогБазы + "Обмен\ВыгрузкаУТ11_ПрошлыйМесяц.xml";

Такой подход делает ваше решение более переносимым.

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

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

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

  2. Оптимизация правил обмена: В «Конвертации данных» можно оптимизировать запросы и алгоритмы, используемые для выборки и обработки данных.

  3. Использование фоновых заданий: Запуск обмена как фонового задания позволяет не блокировать работу пользователей в клиентском приложении.

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

Заключение

Мы с вами подробно рассмотрели, как программно автоматизировать процесс обмена данными между базами 1С 8.3 с использованием универсального обмена в формате XML. Мы выяснили, что ключ к успеху лежит в грамотном создании правил обмена в «Конвертации данных» и последующем программном управлении стандартной обработкой.

Используя представленные примеры кода для выгрузки и загрузки, а также рекомендации по обработке ошибок, использованию регламентных заданий и оптимизации, вы сможете создать надежные и эффективные механизмы обмена данными, значительно повысив автоматизацию ваших бизнес-процессов. В качестве практического примера такого готового решения можно рассмотреть автоматическую синхронизацию между УТ 11.5 и БП 3.0 — есть синхронизация документов из УТ 11 в БП.

Помните, что каждый сценарий обмена уникален, и вам может потребоваться дополнительная доработка правил и кода для полного соответствия вашим требованиям. Если стандартный обмен через XML-файлы не подходит, например, при работе с не полностью идентичными базами, стоит рассмотреть адаптивные инструменты выгрузки или даже универсальный перенос данных по технологии COM+HTTP. Однако, основы, которые мы разобрали, станут отличной отправной точкой для решения большинства задач по автоматизированному обмену данными в 1С.

← На главную