Перенос данных между конфигурациями 1С:Зарплата и Управление Персоналом 3.1 и 1С:Управление производственным предприятием 1.3 является стандартной задачей при разделении контуров учета. Однако настройка этого процесса в автоматическом режиме через регламентные задания требует понимания работы программных механизмов обработки УниверсальныйОбменДаннымиXML (УОД). В этой статье мы подробно разберем, как реализовать обмен на стороне сервера, обходя ограничения модулей форм, и обеспечив корректную работу с планами обмена.
При попытке запустить обмен «на автомате» программисты часто сталкиваются с тем, что стандартные процедуры вызова обработки прописаны в модуле формы. Регламентные задания выполняются в фоновом режиме на сервере, где объект Форма недоступен. Следовательно, любые вызовы модальных окон, предупреждений или просто обращение к элементам формы приведут к аварийному завершению задания.
Для решения этой проблемы мы должны работать напрямую с объектом обработки, создавая его программно в серверном модуле или в модуле менеджера внешней обработки. Выясним причину, почему это важно: только программное создание объекта позволяет передать все необходимые параметры (пути к файлам, узлы, правила) напрямую в свойства обработки.
Рассмотрим пример кода, который позволяет инициализировать обработку УниверсальныйОбменДаннымиXML, загрузить в нее правила и выполнить выгрузку по определенному узлу плана обмена. Этот код идеально подходит для размещения в процедуре, вызываемой регламентным заданием.
// Создаем объект обработки программно
УОД = Обработки.УниверсальныйОбменДаннымиXML.Создать();
// Устанавливаем режим работы
УОД.РежимОбмена = "Выгрузка";
// Указываем пути к файлам.
// ВАЖНО: используйте только сетевые UNC-пути, доступные серверу 1С
УОД.ИмяФайлаОбмена = "\\SERVER-STORAGE\Exchange\Export_ZUP_to_UPP.xml";
УОД.ИмяФайлаПравилОбмена = "\\SERVER-STORAGE\Exchange\Rules_ZUP_UPP.xml";
// Настройка удаления регистрации изменений:
// 0 - не удалять, 1 - удалять автоматически после успешной выгрузки
УОД.ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 1;
// Загружаем правила обмена в память
УОД.ЗагрузитьПравилаОбмена();
// Определяем узел плана обмена, по которому будет идти выгрузка
// Например, получаем его из заранее подготовленной настройки
УзелОбмена = ПланыОбмена.УдалитьОбменЗарплатаУправлениеПерсоналом25УправлениеПроизводственнымПредприятием13.НайтиПоКоду("УПП");
// Проходим по таблице правил выгрузки и привязываем наш узел
// Это необходимо, чтобы обработка понимала, по каким зарегистрированным изменениям работать
ТаблицаПравил = УОД.ТаблицаПравилВыгрузки;
Для каждого СтрокаРаздела Из ТаблицаПравил.Строки Цикл
Для каждого СтрокаПравила Из СтрокаРаздела.Строки Цикл
СтрокаПравила.СсылкаНаУзелОбмена = УзелОбмена;
КонецЦикла;
КонецЦикла;
// Отключаем информационные сообщения для фонового режима
УОД.НеВыводитьНикакихИнформационныхСообщенийПользователю = Истина;
// Запускаем процесс
Попытка
УОД.ВыполнитьВыгрузку();
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Информация, , , "Выгрузка успешно завершена");
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка выгрузки: " + ТекстОшибки);
КонецПопытки;
Проанализируем ситуацию, когда необходимо не только выгрузить, но и загрузить данные. Основная сложность при использовании УниверсальныйОбменДаннымиXML для загрузки заключается в том, что она является «низкоуровневым» инструментом. Она загружает объекты, но автоматически не обновляет НомерПринятогоСообщения в узле плана обмена.
Разберем по шагам, как правильно организовать загрузку в фоновом задании:
РежимОбмена = "Загрузка".НеВыводитьНикакихИнформационныхСообщенийПользователю = Истина.ЧтениеXML перед тем, как отдать файл обработке.ВыполнитьЗагрузку().НомерПринятого, полученный на шаге 3.Посмотрим на пример реализации загрузки:
ОбработкаЗагрузки = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаЗагрузки.РежимОбмена = "Загрузка";
ОбработкаЗагрузки.ИмяФайлаОбмена = "\\SERVER-STORAGE\Exchange\Export_UPP_to_ZUP.xml";
ОбработкаЗагрузки.НеВыводитьНикакихИнформационныхСообщенийПользователю = Истина;
Попытка
ОбработкаЗагрузки.ВыполнитьЗагрузку();
// Дополнительный код по обновлению номера сообщения в узле плана обмена
// должен располагаться здесь
Исключение
// Обработка критических ошибок загрузки
КонецПопытки;
Для стабильной работы «на автомате» необходимо учитывать специфику работы серверного кластера 1С:
Права доступа. Фоновое задание выполняется от имени пользователя операционной системы, под которым запущен сервер 1С (обычно это USR1CV8). Убедитесь, что у этой учетной записи есть права на чтение и запись в папку с файлами обмена. Помните, что сервер 1С «не видит» ваши личные сетевые диски (например, диск Z:), поэтому всегда используйте прямые пути формата \\ИмяСервера\Папка\Файл.xml.
Регистрация изменений. В коде выше мы использовали ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 1. Это критично для автоматизации. Если оставить значение 0, то при следующей выгрузке программа снова выгрузит те же самые данные, так как регистрация в плане обмена не будет очищена. Это приведет к лавинообразному росту размера файла обмена.
Параметры правил обмена. Если ваши правила, созданные в «Конвертации данных», используют параметры (например, ОрганизацияДляФильтрации или ДатаНачала), их необходимо заполнить программно перед вызовом ВыполнитьВыгрузку(). Параметры хранятся в свойстве Параметры объекта обработки, которое представляет собой структуру или таблицу значений.
Рассмотрим совет опытных разработчиков: если вы работаете в современных версиях ЗУП 3.1, стоит рассмотреть переход на стандартный механизм Синхронизации данных, построенный на базе Библиотеки Стандартных Подсистем (БСП). Стандартный механизм «из коробки» умеет:
Однако, если ваша конфигурация УПП 1.3 сильно изменена, использование классической обработки УниверсальныйОбменДаннымиXML с самописными правилами часто остается единственным быстрым способом реализации специфических требований бизнеса. В этом случае приведенный выше код станет надежным фундаментом для вашей автоматизации.