Как встроить правила конвертации данных в конфигурацию 1С и запустить обмен программно

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

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

Зачем хранить правила внутри конфигурации?

Прежде чем перейти к технической реализации, проанализируем преимущества хранения правил в метаданных (макетах):

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

Шаг 1: Подготовка и создание макета в Конфигураторе

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

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

При выборе типа макета рекомендуется использовать «Двоичные данные». Это наиболее универсальный способ, который исключает искажение кодировки XML-файла при сохранении. Назовем макет, например, ПравилаОбменаСБухгалтерией. После создания система предложит выбрать файл на диске — укажите ваш файл правил, полученный из КД 2.0.

Шаг 2: Алгоритм программного извлечения и загрузки правил

Поскольку стандартный объект ОбработкаОбъекта.УниверсальныйОбменДаннымиXML работает с файлами на диске, нам необходимо реализовать механизм временного извлечения правил. Разберем по шагам, как это написать в коде.

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


Процедура ВыполнитьВыгрузкуПоПравиламИзМакета()
    
    // 1. Получаем макет из метаданных
    // Предположим, код пишется в модуле обработки, где лежит макет
    МакетПравил = ЭтотОбъект.ПолучитьМакет("ПравилаОбменаСБухгалтерией");
    
    // 2. Создаем временный файл во временном каталоге ОС
    ИмяФайлаПравил = ПолучитьИмяВременногоФайла("xml");
    
    // 3. Записываем двоичные данные макета в этот файл
    МакетПравил.Записать(ИмяФайлаПравил);
    
    // 4. Инициализируем стандартную обработку обмена
    ОбменОбект = Обработки.УниверсальныйОбменДаннымиXML.Создать();
    ОбменОбект.ИмяФайлаПравил = ИмяФайлаПравил;
    
    // Важно загрузить правила в память обработки
    ОбменОбект.ЗагрузитьПравилаОбмена();
    
    // 5. Настраиваем параметры выгрузки
    ОбменОбект.ИмяФайлаДанных = "C:\Exchange\ExportData.xml"; // Путь, куда выгружаем данные
    ОбменОбект.РежимОбмена = "Выгрузка";
    
    // Если в правилах есть параметры, их можно заполнить так:
    // Парам = ОбменОбект.ТаблицаПараметровПравил.Найти("Организация", "Имя");
    // Если Парам <> Неопределено Тогда Парам.Значение = ВыбраннаяОрганизация; КонецЕсли;
    
    // 6. Запускаем выполнение
    ОбменОбект.ВыполнитьВыгрузку();
    
    // 7. Удаляем временный файл после работы
    Попытка
        УдалитьФайлы(ИмяФайлаПравил);
    Исключение
        // Ошибка удаления не критична для обмена
    КонецПопытки;
    
КонецПроцедуры

Шаг 3: Решение проблемы прав доступа (Привилегированный режим)

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

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

Рассмотрим пример кода в модуле документа:


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

Важное замечание: Выполнение выгрузки в транзакции проведения документа — это ресурсозатратная операция. Если принимающая база недоступна или объем данных велик, пользователь столкнется с "зависанием" интерфейса. Проанализируем более надежный способ через ПланыОбмена.

Шаг 4: Оптимальная архитектура через План обмена

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

  1. Создаем новый ПланОбмена (например, ОбменСВнешнейСистемой) и включаем в него нужные документы.
  2. При проведении документа система автоматически (или программно через ПланыОбмена.ЗарегистрироватьИзменения()) помечает объект к выгрузке. Это происходит мгновенно и не блокирует работу пользователя.
  3. Настраиваем Регламентное задание, которое работает под полными правами по расписанию (например, раз в минуту).
  4. Внутри регламентного задания используем код из Шага 2, но вместо выгрузки всех данных, передаем в обработку УниверсальныйОбменДаннымиXML ссылку на узел плана обмена: ОбменОбект.УзелДляВыгрузкиДляПлановОбмена = СсылкаНаУзел;.

Шаг 5: Использование Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация (например, УПП поздних редакций или ERP) базируется на БСП, то задача существенно упрощается. В БСП уже существует справочник «Правила конвертации объектов», в который можно загрузить XML-файл прямо в пользовательском режиме.

Выясним, как это работает в БСП:

Итоги и рекомендации

Мы рассмотрели несколько способов интеграции правил конвертации в 1С. Подведем итоги нашего анализа:

Для простых задач и старых конфигураций идеально подходит вариант с Макетом и программным заполнением свойств объекта Обработки.УниверсальныйОбменДаннымиXML. Это быстро реализуется и надежно работает.

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

Помните, что при работе с временными файлами (ПолучитьИмяВременногоФайла) на серверных кластерах, файлы создаются на стороне сервера. Убедитесь, что у учетной записи, под которой запущена служба 1C:Enterprise Server, есть права на запись в папку временных файлов.

← На главную