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